はじめに
この記事は初めてのAuth0ハンズオンの続編で、Auth0のユニークな機能の一つであるAutomatic Migrationの検証手順です。Automatic Migrationは、お客様が既にご利用中の認証DatabaseをAuth0に接続して、認証が発生したタイミングでUser Credentialをシームレスにお客様の認証DatabaseからAuth0のDatabaseに移行する機能です。
事前準備
事前に下記をご準備お願いします。
- MacまたはWindows PC
- Chrome
- Node.js, Node Package Manager
- Auth0の無料トライアルアカウント
- Database環境
MySQL, MongodB, PostreSQL, Oracle等、主要なデータベースであればサポートしています。この記事ではMongoDB Atlasで検証しており、詳細な環境構築手順は割愛しています。
検証
Databaseの設定
左ペインの"Connections"->"Database"をクリック、右上の"CREATE DB CONNECTION"を押します。
"NAME"に任意の名前を入力して下の"CREATE"を押します。
"Custom Database"タブをクリックして"User my own database"フリップスイッチをオンにします。
このスイッチをオンにすることで、お客様の認証の認証データベースをAuth0に接続することができます。
"Settings"タブをクリックして"Import Users to Auth0"フリップスイッチをオンにします。
このスイッチをオンにすることで、認証が発生したタイミングでUser Credentialをシームレスにお客様の認証データベースからAuth0のデータベースに移行します。
"Custom Database"タブをクリックして"Database Action Scripts"->"Login"のに下記のコードを作成して"SAVE"を押します。
"Heads up!"に記載されているGlobal IP AddressからDatabaseにアクセスできるようにDatabase側のセキュリティポリシーを変更お願いします。
function login(email, password, callback) {
const {MongoClient} = require("mongodb@3.1.4");
const dbUser = configuration.DBUSER;
const dbPwd = configuration.DBPWD;
const dbHost = configuration.DBHOST;
const dbName = configuration.DBNAME;
const usersCollection = configuration.USERSCOLLECTION;
const uri = `mongodb+srv://${dbUser}:${dbPwd}@${dbHost}/test?retryWrites=true`;
const client = new MongoClient(uri, { useNewUrlParser: true });
client.connect(err => {
if (err) return callback(err);
const collection = client.db(dbName).collection(usersCollection);
collection.findOne({email: email, password}, (err, user) => {
if (err) return callback(err);
if (!user) return callback(null);
const profile = {
...user,
user_id: user.email,
app_metadata: {
migrated: true
}
};
callback(null, profile);
client.close();
});
});
}
"Settings"でDatabaseの環境変数を設定します。
接続するDatabaseの環境に沿って変数を設定して下さい。
- DBUSER
- DBPWD
- DBHOST
- DBNAME
- USERCOLLECTION
"TRY"ボタンを押してDatabase-Tableに存在するUser Credentialを入力して"TRY"を押します。"The profile is:xxx"が返ってきたら成功です。
Applicationの設定
初めてのAuth0ハンズオンので作成したApplicationをクリック、"Connections"タブをクリックして作成したDatabase以外のフリップスイッチをオフにします。
動作確認
Applicationを起動、Chromeでhttp://localhost:3000
にアクセスしてDatabase上に存在するUser Credentialでログインします。
$ pwd
~/auth0-react-samples/01-Login
$ npm start
"Users&Roles"->"Users"をクリック、移行されたユーザをクリックしてapp_metadataに"Migrated : true"フラグが立っていることを確認します。
[補足]どのカラムがIDかは下記のコードブロックで指定しています。" collection.findOne({email: email, password}, (err, user) => {"のはじめの"email"でemailがIDであることを指定しています。Databaseのスキーマに応じて変更お願いします。
collection.findOne({email: email, password}, (err, user) => {
if (err) return callback(err);
if (!user) return callback(null);
const profile = {
...user,
user_id: user.email,
app_metadata: {
migrated: true
}
};
callback(null, profile);
client.close();
});
おわりに
User Credentialの移行で最も頭が痛いのは、エンドユーザ様にパスワードリセットを強要しなければならないことかと思います。パスワードリセットの要求を受けたエンドユーザ様は、何故?何かセキュリティ関連の事故でもあったの?と不安を駆り立てられ、それが原因で会員を退会してしまうかもしれません。Auth0はハッシュで暗号化されたパスワードをAuth0のハッシュアルゴリズム(bcrypt)再ハッシュしてAuth0のDatabaseに移行するため、エンドユーザ様にてパスワードをリセット頂くことなくシームレスに移行できることが特徴です。