カスタムデータベース接続を作成する

利用可能性はAuth0プランによって異なる

この機能が利用できるかどうかは、ご利用のAuth0プラン(または契約)によります。詳細については、「価格設定」をお読みください。

独自のユーザーデータベースをお持ちの場合は、そのデータベースをIDプロバイダーに使用してユーザーを認証することができます。このプロセスでは、カスタムデータベース接続の作成、データベースアクションスクリプトの作成、構成パラメーターの追加といった操作を行います。

Auth0では、以下に示した一般に使用されるほとんどのデータベースの接続とスクリプトを作成することができます。

  • ASP.NET Membership Provider

  • MongoDB

  • MySQL

  • PostgreSQL

  • SQLServer

  • Windows Azure SQL Database

  • 基本認証でアクセスされるWebサービス

正しく構成されたカスタムスクリプトを使用すれば、あらゆる種類のデータベースやWebサービスに接続することができます。入力値のサニタイジングは顧客側で完了しなければなりません。Auth0では、カスタムデータベースによって渡されたユーザー名/パスワードの組み合わせをサニタイズまたは検証しません。カスタムデータベーススクリプトは、Auth0のレート制限ポリシーの適用対象となります。

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

ファイアウォールの内側にいる場合、この機能を正しく動作させるには、適切なAuth0のIPアドレスをAllow List(許可リスト)に追加する必要があるかもしれません。

Auth0 Dashboardで接続を作成する

  1. [Auth0 Dashboard]>[Authentication(認証)]>[Database(データベース)]に移動して、[Create DB Connection(DB接続の作成)]を選択します。

  2. 接続の設定を構成し、[Create(作成)]をクリックします。

    パラメーター 定義
    Name(名前) 接続の名前です。名前の先頭と末尾には英数字を使用し、英数字とダッシュのみを含め、35文字以内で指定する必要があります。
    Requires Username(ユーザー名を要求する) 登録でユーザー名メールアドレスの入力をユーザーに強制します。
    Username Length(ユーザー名の長さ) ユーザー名の最小と最大の長さを設定します。
    Disable Sign Ups(サインアップを無効にする) アプリケーションへのサインアップを抑止します。API資格情報またはAuth0 Dashboardを使ってこれまでと変わりなく、ユーザーを作成することができます。
    Auth0で接続を作成すると、([Settings(設定)]ビューのほかに)以下のビューも表示されます。

    • Password Policy(パスワードポリシー)

    • Custom Database(カスタムデータベース)

    • アプリケーション

    • [Try Connection(接続を試す)]

  3. [Custom Database(カスタムデータベース)]ビューを選択し、[Use my own database(独自のデータベースを使用する)]スイッチを有効にします。

    カスタムデータベースを有効にする 独自データベース使用オプション

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

[Use my own database(独自のデータベースを使用する)]スイッチを切り替えると、[Database Action Scripts(データベースアクションスクリプト)]領域が有効になり、ここでスクリプトを作成し、データベース使用時の認証の仕組みを設定します。データベースアクションスクリプトを記述するか、[Templates(テンプレート)]ドロップダウンからテンプレートを選択し、必要に応じて変更することができます。

loginスクリプトは構成する必要があります。ユーザー機能性のその他のスクリプトはしてもしなくても構いません。

使用できるデータベースアクションスクリプトは以下のとおりです。

名前 説明 パラメーター
Login(ログイン)
必須
ユーザーがログインを試みるたびに実行します。 emailpassword
Create(作成) ユーザーがサインアップするときに実行します。 user
Verify(検証) ユーザーが検証リンクに従った後に実行します。 email
Change Password(パスワード変更) パスワードのリセット要求後にユーザーが確認リンクをクリックすると実行します。 emailnewPassword
Get User(ユーザー取得) ユーザーを認証することなく、データベースからユーザープロファイルを取得します。 email
Delete(削除) APIまたはAuth0 Dashboardを使用してユーザーが削除されると実行します。 id

スクリプトの詳細については、「カスタムデータベースのアクションスクリプト用テンプレート」および「カスタムデータベースのアクションスクリプト実行のベストプラクティス」をお読みください。

ログインスクリプトを作成する

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

返されたユーザープロファイルにあるid(またはuser_id)プロパティは、Auth0によってユーザーの識別に使用されます。

複数のカスタムデータベース接続を使っている場合には、ユーザーIDの衝突を避けるために、idの値がすべてのカスタムデータベース接続で一意でなくてはなりません。idの値には、接続名をプレフィックス(スペースは削除)として追加することをお勧めします。ユーザーIDの詳細については、「ユーザーを識別する」をお読みください。

以下の手順は、MySQLデータベースのログインスクリプトの例を示したものです。

  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, {
              // This prefix (replace with your own custom DB name)
              // ensure uniqueness across different custom DBs if there's the
              // possibility of collisions (e.g. if the user ID is an email address or an integer)
              id: 'MyConnection1|' + user.id.toString(),
              nickname: user.nickname,
              email: user.email
            });
          }
        });
      });
    }

    Was this helpful?

    /
    上記のスクリプトはMySQLデータベースに接続し、クエリーを実行してemail == user.emailを含む最初のユーザーを取得します。bcrypt.compareSyncメソッドでは次に、パスワードが一致するかどうかを検証します。一致する場合は、idnickname、およびemailなどのユーザープロファイル情報を含むオブジェクトを返します。このスクリプトは、これらの列を含むusersテーブルを持っていると仮定します。ログインスクリプトによって返されたidを使って、ユーザープロファイルのユーザーID属性を構築します。

  3. [Save and Try(保存して試す)]をクリックします。

  4. [Try(試す)]をクリックしてスクリプトをテストします。(この手順によりスクリプトの保存も行われます。)

    Modal to try the login script.

[Save(保存)]または[Try(試す)]をクリックしないと、スクリプトのテンプレートはAuth0で使用されません。これは、スクリプトを1つだけ変更し、その他に変更を加えない場合にも当てはまります。すべてのスクリプトを設定するには、[Save(保存)]を少なくとも一度はクリックする必要があります。

Organization用カスタムデータベースのサポート

カスタムデータベース接続をOrganizationと組み合わせて使用する場合は、スクリプト署名のcontextパラメーターを使って、idnamemetadataのようなOrganizationの詳細をカスタムデータベースのアクションスクリプトに適用することができます。関連するアクションが組織コンテキストで実行されると、Organizationデータがコンテキストオブジェクトに渡されます。たとえば、ユーザーが組織のログインスクリプトを認証すると、ログインアクションのスクリプトが渡されます。詳細については、「データベース接続」をお読みください。

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

  1. [Auth0 Dashboard]>[Authentication(認証)]>[Database(データベース)]の順に移動します。

  2. データベース接続を選択します。

  3. [Custom Database(カスタムデータベース)]タブで、[Context objects in database scripts(データベーススクリプト内のコンテキストオブジェクト)]を見つけて、[Enable(有効にする)]を選択します。

Organizationコンテキストを使用する

コンテキストオブジェクトがDashboardで有効になると、「context」オブジェクトをカスタムデータベースのアクションスクリプトに追加し、コールバックパラメーターの直前に挿入することができます。イベントがOrganizationコンテキストでトリガーされると、対応するデータを以下の形式でカスタムデータベースのアクションスクリプトで使用できるようになります。

{
    "organization": {
        "display_name": "My Organization",
        "id": "org_XXXXXX",
        "metadata": {
            "example": "value"
        },
        "name": "my-organization"
    }
}

Was this helpful?

/

構成パラメーターを追加する

データベースへの接続に必要な資格情報といったパラメーターは、スクリプトエディターの下にある[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'
  });
}

Was this helpful?

/

もっと詳しく