4
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Auth0Advent Calendar 2019

Day 13

Auth0のユニークな機能 - Automatic Migration編

Last updated at Posted at 2019-12-02

はじめに

この記事は初めての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に移行するため、エンドユーザ様にてパスワードをリセット頂くことなくシームレスに移行できることが特徴です。

4
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?