メインコンテンツへスキップ
独自のユーザーデータベースがある場合は、それを Auth0 の として使用して、ユーザーを認証できます。以下の手順に従って、カスタムデータベース接続を作成し、データベース アクションスクリプトを作成して、設定パラメーターを追加してください。
データベースに、idnicknameemailpassword などの ユーザープロファイル属性 を保存するための適切なフィールドがあることを確認してください。Auth0 のユーザープロファイルスキーマについては、Normalized User Profiles を参照してください。ユーザープロファイルの更新の詳細については、Update User Profiles Using Your Database を参照してください。
Auth0 では、一般的によく使われるほとんどのデータベース向けに、接続とスクリプトを作成できます。以下が含まれます。
  • ASP.NET Identity
  • MongoDB
  • MySQL
  • PostgreSQL
  • SQLServer
  • Windows Azure SQL Database
  • Basic Auth 経由でアクセスする Web サービス
適切に設定されたカスタムスクリプトを使用すれば、あらゆる種類のデータベースや Web サービスに接続できます。入力値のサニタイズはお客様側で行う必要がある点に注意してください。Auth0 は、カスタムデータベースから渡される username/password の組み合わせをサニタイズまたは検証しません。Custom Database スクリプトには、Auth0 の Rate Limit Policy が適用されます。

ネットワークファイアウォール

ファイアウォールの内側にある環境では、この機能を正しく動作させるために、適切な Auth0 IP アドレスを許可リストに追加する必要がある場合があります。

Auth0 Dashboard で接続を作成する

  1. Auth0 Dashboard > Authentication > Database に移動し、Create DB Connection を選択します。
  2. 接続の設定を行い、Create を選択します。
パラメーター説明
Name接続の名前です。名前は英数字で始まり、英数字で終わる必要があります。また、使用できるのは英数字とダッシュのみで、35 文字以内である必要があります。
Choose one or more attributes as user identifiers接続の識別子属性を 1 つ以上選択します。
Choose one or more authentication methodsユーザーに提示する認証方法を選択します。
Use my own databaseAuth0 に接続する独自のデータベースがある場合は、オンにします。
Disable Sign Ups公開エンドポイントからの新規ユーザー登録を無効にします。
Promote Connection to Domain Levelこの接続をドメインレベルに昇格して、サードパーティアプリケーションで使用できるようにします。
Auth0 で接続が作成されると、次のビューが表示されます (Settings ビューに加えて) 。
  • Attributes
    • Authentication Methods
    • Custom Database
    • Applications
  1. Custom Database ビューを選択し、Use my own database スイッチを有効にします。
    Enable Custom Database Use My Own Database Option

データベースアクションスクリプトを作成する

Use my own database スイッチをオンにすると、Database Action Scripts 領域が有効になり、データベース使用時の認証の動作を設定するスクリプトを作成できるようになります。データベースアクションスクリプトは自分で記述することも、Templates ドロップダウンからテンプレートを選択して必要に応じて修正することもできます。 login スクリプトの設定は必須です。ユーザー関連機能の追加スクリプトは任意です。 利用可能なデータベースアクションスクリプトは次のとおりです。
名前説明パラメーター
Login
必須
ユーザーがログインを試みるたびに実行されます。email, password
Createユーザーがサインアップしたときに実行されます。user
Verifyユーザーが確認リンクをたどった後に実行されます。email
Change Passwordパスワード再設定のリクエスト後、ユーザーが確認リンクをクリックすると実行されます。email, newPassword
Get Userユーザーを認証せずに、データベースからユーザープロファイルを取得します。email
DeleteAPI または Auth0 Dashboard を使用してユーザーが削除されたときに実行されます。id
スクリプトの詳細については、Custom Database Action Script Templates および Custom Database Action Script Execution Best Practices を参照してください。

Login スクリプトを作成する

複数のデータベース間でのユーザー ID の衝突を回避する

返されるユーザープロファイルの id (または user_id) プロパティは、Auth0 がユーザーを識別するために使用します。複数のカスタムデータベース接続を使用している場合は、ユーザー ID の衝突を避けるため、id の値がすべてのカスタムデータベース接続で一意である必要があります。推奨される方法は、id の値の先頭に接続名 (空白は削除) を付けることです。ユーザー ID の詳細については、Identify Users を参照してください。
以下の手順では、MySQL データベース用の Login スクリプトの例を使用します。
  1. Use my own database スイッチをオンにすると、Database Action Scripts 領域が有効になります。Login タブが選択されていることを確認してください。
  2. Templates ドロップダウンを使用して、MySQL データベーススクリプトテンプレートを選択します。
    function login(email, password, callback) {
      var bcrypt = require('bcrypt');
      var mysql = require('mysql');
      var connection = mysql.createConnection({
        host: 'localhost',
        user: 'me',
        password: 'secret',
        database: 'mydb'
      });
      connection.connect();
      var query = "SELECT id, nickname, email, password " +
        "FROM users WHERE email = ?";
      connection.query(query, [email], function (err, results) {
        if (err) return callback(err);
        if (results.length === 0) return callback(new WrongUsernameOrPasswordError(email));
        var user = results[0];
        bcrypt.compare(password, user.password, function (err, isValid) {
          if (err) {
            callback(err);
          } else if (!isValid) {
            callback(new WrongUsernameOrPasswordError(email));
          } else {
            callback(null, {
              // この接頭辞(独自のカスタム DB 名に置き換えてください)は、
              // 衝突の可能性がある場合(たとえば、ユーザー ID がメールアドレスや整数の場合)に、
              // 異なるカスタム DB 間で一意性を確保します
              id: 'MyConnection1|' + user.id.toString(),
              nickname: user.nickname,
              email: user.email
            });
          }
        });
      });
    }
    
    上記のスクリプトは MySQL データベースに接続し、email == user.email に一致する最初のユーザーを取得するクエリを実行します。 次に、bcrypt.compareSync メソッドを使用してパスワードが一致することを検証し、一致した場合は idnicknameemail を含むユーザープロファイル情報を格納したオブジェクトを返します。 このスクリプトは、これらの列を含む users テーブルが存在することを前提としています。Login スクリプトから返された id は、ユーザープロファイルのユーザー ID 属性の構築に使用されます。
  3. Save and Try を選択します。
  4. ポップアップモーダルでメールアドレスとパスワードを入力し、Try をクリックします。利用可能なランタイムの一覧から選択できるドロップダウンが表示され、現在のランタイムが先頭に表示されます。
    Login スクリプトを試すためのモーダル。
スクリプトテンプレートは、Save または Try を選択するまで Auth0 では使用されません。これは、1 つのスクリプトだけを変更し、ほかのスクリプトに変更を加えていない場合でも同様です。すべてのスクリプトを反映するには、少なくとも 1 回 Save を選択する必要があります。

組織向けカスタムデータベースのサポート

組織と併用してカスタムデータベース接続を使用する場合は、スクリプトシグネチャの context パラメーターを使うことで、idnamemetadata などの組織の詳細をカスタムデータベースのアクションスクリプトで利用できるようになります。関連するアクションが組織のコンテキストで発生すると、組織データは context オブジェクトを通じて渡されます。たとえば、ユーザーが組織のログインプロンプトで認証すると、login アクションスクリプトにそのデータが渡されます。詳しくは、Database Connections を参照してください。

コンテキストオブジェクトを有効にする

  1. Auth0 Dashboard > Authentication > Database に移動します。
  2. 使用するデータベース接続を選択します。
  3. Custom Database タブで Context objects in database scripts を見つけ、Enable を選択します。
    この機能は、有効にすると無効化できません。
  4. 確認のプロンプトで Confirm を選択します。

組織コンテキストを使用する

Dashboard でコンテキストオブジェクトを有効にすると、callback パラメーターの直前に挿入される context オブジェクトをカスタムデータベースアクションスクリプトに追加できます。イベントが組織コンテキストで発生すると、対応するデータが以下の形式でカスタムデータベースアクションスクリプトから利用できるようになります。
{
    "organization": {
        "display_name": "My Organization",
        "id": "org_XXXXXX",
        "metadata": {
            "example": "value"
        },
        "name": "my-organization"
    }
}
空のコンテキストは常に delete スクリプトに渡されます。

設定パラメーターを追加する

データベースへの接続に必要な認証情報などのパラメーターは、スクリプトエディターの下にあるSettingsセクションに保存できます。これらのパラメーターはすべてのスクリプトで利用でき、データベースアクションスクリプトでは configuration オブジェクトを使ってその値にアクセスできます (例: configuration.MYSQL_PASSWORD) 。 追加したパラメーターをスクリプト内で使用して接続を構成します。たとえば、MySQL Login スクリプトに次のような内容を追加できます。
function login (username, password, callback) {
  var mysql = require('mysql');
  var connection = mysql.createConnection({
    host     : configuration.MYSQL_HOST,
    user     : 'me',
    password : configuration.MYSQL_PASSWORD,
    database : 'mydb'
  });
}

詳細