はじめに
この記事は初めての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"を押します。
![](https://qiita-user-contents.imgix.net/https%3A%2F%2Fi.imgur.com%2FRHVVu3c.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=9bcefd3897bc2a876267e687a0bc21dc)
"NAME"に任意の名前を入力して下の"CREATE"を押します。
![](https://qiita-user-contents.imgix.net/https%3A%2F%2Fi.imgur.com%2FDJvktNb.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=b69d0204f30fbb8da6f73420370f9ef3)
"Custom Database"タブをクリックして"User my own database"フリップスイッチをオンにします。
このスイッチをオンにすることで、お客様の認証の認証データベースをAuth0に接続することができます。
![](https://qiita-user-contents.imgix.net/https%3A%2F%2Fi.imgur.com%2F3g4gbev.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=99a28b3a76b6d263c1229bc19aebc7cc)
"Settings"タブをクリックして"Import Users to Auth0"フリップスイッチをオンにします。
このスイッチをオンにすることで、認証が発生したタイミングでUser Credentialをシームレスにお客様の認証データベースからAuth0のデータベースに移行します。
![](https://qiita-user-contents.imgix.net/https%3A%2F%2Fi.imgur.com%2F3HxpwTu.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=9c194440f229da3e1ddaad31f3369b27)
"Custom Database"タブをクリックして"Database Action Scripts"->"Login"のに下記のコードを作成して"SAVE"を押します。
"Heads up!"に記載されているGlobal IP AddressからDatabaseにアクセスできるようにDatabase側のセキュリティポリシーを変更お願いします。
![](https://qiita-user-contents.imgix.net/https%3A%2F%2Fi.imgur.com%2F0BCQ86K.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=db6852011d20d1baff0ec4e0662df485)
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
![](https://qiita-user-contents.imgix.net/https%3A%2F%2Fi.imgur.com%2F8ezicUI.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=bc538615578398f89774f1cf7c0d5831)
"TRY"ボタンを押してDatabase-Tableに存在するUser Credentialを入力して"TRY"を押します。"The profile is:xxx"が返ってきたら成功です。
![](https://qiita-user-contents.imgix.net/https%3A%2F%2Fi.imgur.com%2Fwz4xI2p.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=6513cbc2b8a5135204cca144eae8202d)
Applicationの設定
初めてのAuth0ハンズオンので作成したApplicationをクリック、"Connections"タブをクリックして作成したDatabase以外のフリップスイッチをオフにします。
![](https://qiita-user-contents.imgix.net/https%3A%2F%2Fi.imgur.com%2FHC388os.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=80bb985686662a807f7a4d9b5e8b460e)
動作確認
Applicationを起動、Chromeでhttp://localhost:3000
にアクセスしてDatabase上に存在するUser Credentialでログインします。
$ pwd
~/auth0-react-samples/01-Login
$ npm start
![](https://qiita-user-contents.imgix.net/https%3A%2F%2Fi.imgur.com%2FtgIYIDP.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=e9997761ffabe5f8f5cf1dc339b5f87a)
![](https://qiita-user-contents.imgix.net/https%3A%2F%2Fi.imgur.com%2Fx28NDJ1.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=70ec7e07f265588d305481b9c6e04975)
"Users&Roles"->"Users"をクリック、移行されたユーザをクリックしてapp_metadataに"Migrated : true"フラグが立っていることを確認します。
![](https://qiita-user-contents.imgix.net/https%3A%2F%2Fi.imgur.com%2FsTtiGjm.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=456ffccef3fc7ccb7edb1f4ad98a03d2)
[補足]どのカラムが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に移行するため、エンドユーザ様にてパスワードをリセット頂くことなくシームレスに移行できることが特徴です。