カスタムデータベース接続を作成する
利用可能性は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で接続を作成する
[Auth0 Dashboard]>[Authentication(認証)]>[Database(データベース)]に移動して、[Create DB Connection(DB接続の作成)]を選択します。
接続の設定を構成し、[Create(作成)]をクリックします。
Auth0で接続を作成すると、([Settings(設定)]ビューのほかに)以下のビューも表示されます。パラメーター 定義 Name(名前) 接続の名前です。名前の先頭と末尾には英数字を使用し、英数字とダッシュのみを含め、35文字以内で指定する必要があります。 Requires Username(ユーザー名を要求する) 登録でユーザー名とメールアドレスの入力をユーザーに強制します。 Username Length(ユーザー名の長さ) ユーザー名の最小と最大の長さを設定します。 Disable Sign Ups(サインアップを無効にする) アプリケーションへのサインアップを抑止します。API資格情報またはAuth0 Dashboardを使ってこれまでと変わりなく、ユーザーを作成することができます。 Password Policy(パスワードポリシー)
Custom Database(カスタムデータベース)
アプリケーション
[Try Connection(接続を試す)]
[Custom Database(カスタムデータベース)]ビューを選択し、[Use my own database(独自のデータベースを使用する)]スイッチを有効にします。
データベースアクションスクリプトを作成する
[Use my own database(独自のデータベースを使用する)]スイッチを切り替えると、[Database Action Scripts(データベースアクションスクリプト)]領域が有効になり、ここでスクリプトを作成し、データベース使用時の認証の仕組みを設定します。データベースアクションスクリプトを記述するか、[Templates(テンプレート)]ドロップダウンからテンプレートを選択し、必要に応じて変更することができます。
login
スクリプトは構成する必要があります。ユーザー機能性のその他のスクリプトはしてもしなくても構いません。
使用できるデータベースアクションスクリプトは以下のとおりです。
名前 | 説明 | パラメーター |
---|---|---|
Login(ログイン) 必須 |
ユーザーがログインを試みるたびに実行します。 | email 、password |
Create(作成) | ユーザーがサインアップするときに実行します。 | user |
Verify(検証) | ユーザーが検証リンクに従った後に実行します。 | email |
Change Password(パスワード変更) | パスワードのリセット要求後にユーザーが確認リンクをクリックすると実行します。 | email 、newPassword |
Get User(ユーザー取得) | ユーザーを認証することなく、データベースからユーザープロファイルを取得します。 | email |
Delete(削除) | APIまたはAuth0 Dashboardを使用してユーザーが削除されると実行します。 | id |
スクリプトの詳細については、「カスタムデータベースのアクションスクリプト用テンプレート」および「カスタムデータベースのアクションスクリプト実行のベストプラクティス」をお読みください。
ログインスクリプトを作成する
複数データベースでのユーザーIDの衝突を回避する
返されたユーザープロファイルにあるid
(またはuser_id
)プロパティは、Auth0によってユーザーの識別に使用されます。
複数のカスタムデータベース接続を使っている場合には、ユーザーIDの衝突を避けるために、id
の値がすべてのカスタムデータベース接続で一意でなくてはなりません。id
の値には、接続名をプレフィックス(スペースは削除)として追加することをお勧めします。ユーザーIDの詳細については、「ユーザーを識別する」をお読みください。
以下の手順は、MySQLデータベースのログインスクリプトの例を示したものです。
[Use my own database(独自のデータベースを使用する)]スイッチを切り替えた後、[Database Action Scripts(データベースアクションスクリプト)]領域が有効になります。[Login(ログイン)]タブが開いていることを確認します。
[Templates(テンプレート)]ドロップダウンを使用して、MySQLデータベーススクリプト用テンプレートを選択します。
上記のスクリプトは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?
/email == user.email
を含む最初のユーザーを取得します。bcrypt.compareSync
メソッドでは次に、パスワードが一致するかどうかを検証します。一致する場合は、id
、nickname
、およびemail
などのユーザープロファイル情報を含むオブジェクトを返します。このスクリプトは、これらの列を含むusers
テーブルを持っていると仮定します。ログインスクリプトによって返されたid
を使って、ユーザープロファイルのユーザーID属性を構築します。[Save and Try(保存して試す)]をクリックします。
[Try(試す)]をクリックしてスクリプトをテストします。(この手順によりスクリプトの保存も行われます。)
[Save(保存)]または[Try(試す)]をクリックしないと、スクリプトのテンプレートはAuth0で使用されません。これは、スクリプトを1つだけ変更し、その他に変更を加えない場合にも当てはまります。すべてのスクリプトを設定するには、[Save(保存)]を少なくとも一度はクリックする必要があります。
Organization用カスタムデータベースのサポート
カスタムデータベース接続をOrganizationと組み合わせて使用する場合は、スクリプト署名のcontext
パラメーターを使って、id
、name
、metadata
のようなOrganizationの詳細をカスタムデータベースのアクションスクリプトに適用することができます。関連するアクションが組織コンテキストで実行されると、Organizationデータがコンテキストオブジェクトに渡されます。たとえば、ユーザーが組織のログインスクリプトを認証すると、ログインアクションのスクリプトが渡されます。詳細については、「データベース接続」をお読みください。
コンテキストオブジェクトを有効にする
[Auth0 Dashboard]>[Authentication(認証)]>[Database(データベース)]の順に移動します。
データベース接続を選択します。
[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?
{
"organization": {
"display_name": "My Organization",
"id": "org_XXXXXX",
"metadata": {
"example": "value"
},
"name": "my-organization"
}
}
Was this helpful?
{
"organization": {
"display_name": "My Organization",
"id": "org_XXXXXX",
"metadata": {
"example": "value"
},
"name": "my-organization"
}
}
Was this helpful?
{
"organization": {
"display_name": "My Organization",
"id": "org_XXXXXX",
"metadata": {
"example": "value"
},
"name": "my-organization"
}
}
Was this helpful?
{
"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?