メール / パスワード認証
項目一覧
Overview
メール/パスワード認証により、ユーザーはメールアドレスを使用して登録およびログインできます。Atlas App Services では、ユーザーがログインする前にメール/パスワードを確認する必要があります。
次の図は、ログインのプロセスの流れを示したものです。
注意
ユーザーのメールアドレスでは大文字と小文字が区別されます。たとえば、TestAccount@example.com
のメールアドレスのユーザーは、testaccount@example.com
というアドレスを使用した場合、ログインできません。
構成
左側のナビゲーションで、[Authentication(認証)] をクリックします。
認証プロバイダーのリストで、Email/Password を選択します。この画面から、プロバイダーを設定して有効にできます。次のセクションを使用すると、プロセスをガイドします。
App Services CLIを使用してメール/パスワード認証プロバイダーを有効にして設定するには、/auth/providers.json
で構成オブジェクトを定義します。
メール/パスワード プロバイダーの設定は、次のような形式です。
{ "local-userpass": { "name": "local-userpass", "type": "local-userpass", "config": { "autoConfirm": <boolean>, "emailConfirmationUrl": <string>, "confirmEmailSubject": <string>, "runConfirmationFunction": <boolean>, "confirmationFunctionName": <string>, "resetPasswordUrl": <string>, "resetPasswordSubject": <string>, "runResetFunction": <boolean>, "resetFunctionName": <string>, }, "disabled": <boolean> } }
Tip
認証プロバイダーの name
は、常にその type
と同じです。
ユーザー確認
アプリでユーザーの新規アカウントを登録し、確認した後、メール/パスワードのユーザーの認証を行えます。メール/パスワード ユーザーを登録すると、新しいユーザー オブジェクトが作成されます。その後、App Services はアカウントの確認を要求します。新しいユーザー アカウントの確認には、次の 3 つの方法のいずれかを選択できます。
次の図は、ユーザーを確認するプロセスの流れを示したものです。
新しいユーザーアカウントのステータス
ユーザー アカウントは、「保留中」と「確認済み」の 2 つの状態のいずれかになります。
確認プロセスが開始されると、Atlas App Services はユーザー アカウントを作成し、ステータスをPending Confirmationに設定します。この状態では、ユーザーはログインできません。メールアドレスはユーザーアカウントに関連付けられているため、同じメールアドレスを再登録しようとすると失敗します。
アカウントが保留状態の場合、ユーザーはログインする前にアカウントを確認する必要があります。ユーザーがアカウントを確認すると、Atlas App Services はステータスを Confirmed と設定し、ユーザーはログインできるようになります。
ユーザーを自動的に確認した場合、アカウントが Confirmed のステータスで作成され、ユーザーは登録後すぐにログオンできます。
警告
アプリの開発とテストを行っているときにのみ、自動確認を使用するようにします。実稼働アプリケーションでは、常に安全な確認プロセスを使用する必要があります。
保留中のユーザー アカウントの一覧は、UI または App Services API を使用して表示できます。
左側のナビゲーションの [Data Access] の下にある [App Users] をクリックします。
ユーザーリストの一番上で、[Pending] フィルターを選択します。
Realm CLI を使用して保留中のユーザーを表示するには、appservices users list コマンドを使用し、--pending
オプションを含めます。
管理 API を使用して保留中のユーザーを表示するには、 List Usersエンドポイントを使用します。
確認メールの送信
この確認方法では、ユーザーは登録時にメールに返信する必要があります。メールには、確認 URL へのリンクが含まれています。ユーザーは 30 分以内にこのリンクにアクセスして、メールアドレスを管理していることを確認する必要があります。
App Services が確認メールを自動的に送信するようにするには、次の設定を構成します。
Email Confirmation URL: すべての確認メールに含まれる URL のベース。App Services は、この URL にユニークな
token
とtokenId
を追加します。これらは、すべての確認に対してユニークなリンクを作成するクエリ パラメーターとして機能します。ユーザーを確認するには、まずユーザー固有の URL からこれらのクエリパラメーターを抽出します。次に、token
とtokenId
をクライアント SDK のconfirmUser
関数に渡します。モバイル・アプリケーションは、アプリ内で直接メール確認を取り扱えます。これを行うには、ディープリンク を Android またはユニバーサルリンク iOS で設定します。
Email Confirmation Subject: App Services が送信するメールの件名。この値はオプションです。省略した場合、App Services は代わりにデフォルトの件名を使用します。カスタム確認メールの件名には、最大 256 文字を含められます。
注意
確認メールは現在、ベースとなる URL と件名以外のカスタマイズはできません。特に、これらのメールは常に mongodb.com
メールアドレスから送信されます。
実稼働アプリの場合は、組み込みの確認メール方式ではなく、確認関数を使用できます。確認機能を使用すると、完全にカスタマイズされたメール確認をビルドできます。詳細については、「確認関数の実行」を参照してください。
確認機能の実行
新しいユーザーが登録したときに Run a Confirmation Function が可能です。App Services は、確認トークン、トークン ID、およびユーザーのメールを、作成した関数に渡します。次に、関数はユーザーの確認に必要なロジックを実行し、次の結果オブジェクトのいずれかを返します。結果オブジェクトについては、以下で詳しく説明しています。
{ status: 'success' }
{ status: 'fail' }
{ status: 'pending' }
関数内で、ユーザーを確認するカスタム ロジックを定義します。たとえば、関数は次のようになります。
特定のドメインからカスタム確認メールを送信します。外部サービスを使用して、特定のテンプレートでこれらを送信します。
MongoDB Atlas または外部 REST サービス内のコレクションからユーザー権限を読み取ります。
SMS など、メール以外のサービスで確認メールを送信します。
カスタム確認関数シグネチャには 1 つのパラメーターがあります。これは、ユーザー データと確認トークンを含むオブジェクトです。これらのフィールドは次のとおりです。
フィールド | 説明 |
---|---|
username | ユーザーのメールアドレス。 |
token | ユーザーの ID を確認するために使用されるユニークな値。SDK の Confirm User 関数を呼び出すときに使用します。 |
tokenId | ユーザーの ID を確認するために使用されるユニークな値。SDK の Confirm User 関数を呼び出すときに使用します。 |
カスタム ユーザー確認関数は、ステータス フィールドを持つオブジェクトを返します。次の表では、このフィールドの潜在的な値について説明しています。
ステータス | 効果 |
---|---|
success | App Services はユーザーの ID を確認し、ユーザーが新しいアカウントにログインできるようにします。 |
pending | App Services はユーザーの確認ステータスを Pending Confirmation に変更します。これはユーザーの ID を確認したり、ログインを許可したりするものではありません。クライアント アプリケーションは、SDK の Confirm User 関数を呼び出して処理を確定する必要があります。 |
fail | App Services ではユーザー アカウントは作成されません。ユーザーは再度登録することによってのみアカウントの確認を再試行できます。以前のアカウントが存在しないため、ユーザーは同じユーザー名(メール)を再利用できます。 |
以下は、ユーザー確認関数の例です。
指定したメールが有効なメールであることを確認します。
指定したメールで特定のサービスにアクセスできることを確認します。
ユーザーに SMS メッセージを送信します。
メッセージが正常に送信された場合、Atlas App Services に「保留中」ステータスの新しいアカウントを作成するように通知します。
exports = ({ token, tokenId, username }) => { // Validate the username const isValidEmail = myCustomValidatorService.validate(username); // Check if the user has access to this service const isPrivileged = myCustomAuthorizationService.hasAccess(username) // Send a message to the user so that they can confirm themselves const msgSendSuccessful = isValidEmail && isPrivileged && mySmsService.send(username, token, tokenId) if ( msgSendSuccessful ) { return { status: 'pending' }; } else { return { status: 'fail' }; } }
カスタム関数が自動的にユーザーを確認しない限り、関数の実行後にユーザーは確認プロセスを完了するための手段を提供する必要があります。追加の確認手順が完了したら、SDK の Confirm User メソッドを呼び出して、Atlas App Services でのユーザー アカウントの作成を終了します。
ユーザーの自動確認
プロバイダーを Automatically Confirm Users に設定できます。このオプションを選択すると、App Servicesは、登録後すぐに新しいメール/パスワードユーザーを確認します。
警告
App Services は自動確認されたメールアドレスは検証しません。その結果、次のような理由で、そうしたユーザーにメールで連絡を取れないことがあります。
自動的に確認されたユーザーのメールアドレスが、実際にはそのユーザーのものではない場合。(たとえば、ユーザーが
steve.jobs@apple.com
としてサインアップした)ユーザーのメールが、有効なメールでない場合。(たとえば、ユーザーが
my.name@gmail
またはasdavaskljj
としてサインアップした)
このオプションには十分に注意を払ってください。有効な連絡先情報のないユーザー アカウントのパスワードを安全にリセットするのは非常に困難です。
パスワードのリセット
メール/パスワードのユーザーがパスワードを忘れてしまい、リセットしなければならない場合があります。セキュリティ上の理由から、パスワードのリセットを完了する前にユーザーの ID を確認する必要があります。App Services では、これを行うための 2 つの方法が提供されています。
ユーザーの ID を確認した後、パスワード再設定リクエストを完了できます。パスワードのリセットが完了すると、ユーザーは新しいパスワードを使用してログできます。
パスワード リセット メールの送信
プロバイダーをSend a Password Reset Email.に構成できます。ユーザーがパスワードのリセットを要求すると、App Services はパスワードのリセット URL をユーザーのメール アドレスに送信します。ユーザーは 30 分以内にこの URL にアクセスする必要があります。
パスワード リセット メールを構成するときに、次の設定を構成できます。
Password Reset URL: すべてのパスワード リセット メールに含まれる URL のベース。App Services は、この URL にユニークな
token
とtokenId
を追加します。これらは、パスワードのリセットごとにユニークなリンクを作成するクエリ パラメーターとして機能します。ユーザーのパスワードをリセットするには、ユーザーのユニークな URL からこれらのクエリパラメーターを抽出します。トークンと tokenId をクライアント SDK のresetPassword
関数に渡します。Reset Password Email Subject: App Services が送信するメールの件名。この値はオプションです。省略すると、App Servicesはデフォルトの件名を代わりに使用します。カスタム パスワード リセットの件名には最大 256 文字を含められます。
モバイル アプリケーションでは、アプリ内で直接パスワードのリセットを取り扱えます。Android のディープリンクまたは iOS の ユニバーサル リンクを設定します。
注意
パスワード リセット メールは現在、基本 URL と件名以外はカスタマイズできません。特に、これらのメールは常に mongodb.com
メールアドレスから送信されます。
実稼働アプリでは、組み込みのパスワード リセット メール方式ではなく、カスタムのパスワード リセット機能を使用できます。カスタム関数を使用すると、完全にカスタムのメール確認を作成したり、メール以外の方法を使用してパスワード リセット リクエストを確認したりできます。
パスワードリセット機能の実行
プロバイダーを Run a Password Reset
Function に設定できます。SDK で callResetPasswordFunction()
を実行するときに App Services が実行する関数を定義します。App Services は、ユーザーのメール、希望する新しいパスワード、確認トークン、トークン ID を、作成した関数に渡します。次に、関数はパスワードをリセットする前にユーザーの身元を確認するために必要なロジックを実行します。
App Services はユーザーのパスワードをすぐにリセットできます。または、クライアント・アプリケーションからの追加確認を要求することもできます。
App Services 関数は、 status
キーを含むオブジェクトを返す必要があります。キーは、以下のいずれかの値を持つ文字列にマップされます。これらの値については、以下で詳しく説明しています。
{ status: 'success' }
{ status: 'fail' }
{ status: 'pending' }
警告
Realm SDK 関数 callResetPasswordFunction()
は認証されていません。このパスワード回復は、アカウントにログインできないユーザーのみを対象としたものです。そのため、この関数の呼び出しを特定の App Services ユーザーに関連付けることはできません。success
ステータスを返すと、パスワードが関数の password
パラメーターの新しい値に永続的に変更されます。したがって、 success
を返すと、任意のユーザーが他のアプリケーション ユーザーのパスワードをリセットする可能性が出ます。セキュリティのため、信頼できる通信モードでアカウント所有者にメッセージを送信し、 pending
を返す必要があります。
カスタム パスワード リセット機能を使用して、独自のパスワード リセット フローを定義できます。
外部サービスを用いて、特定のテンプレートを使用して特定のドメインからカスタム パスワード リセット メールを送信します。
MongoDB Atlas コレクションとのインターフェースを使用して、パスワードリセットの「クールダウン期間」を実装します。これにより、特定の時間範囲に 1 つのアカウントでパスワード リセットの試行回数が増えるのを食い止められます。
メール以外のサービスを通じてカスタム パスワード リセット メッセージを送信します。
注意
パスワードリセット機能の使用は、パスワード リセット メールを送信するように App Services を設定することと相互に排他的です。カスタム関数を使用するようにパスワード リセットを構成すると、クライアント SDK で sendResetPasswordEmail()
を呼び出した場合、エラーが返されます。
カスタム パスワード リセット関数のシグネチャーは可変長です。つまり、任意の数のパラメーターを受け入れます。最初のものは常に、ユーザー データと確認トークンを含むオブジェクトです。次のパラメーターはすべてカスタムパラメーターです。これらは引数コレクションとしてクライアント SDK に渡されます。たとえば、Client SDK は次のように呼び出します。
callResetPasswordFunction("myUsername", "newPassword", ["Security Question Answer 1", "Security Question Answer 2", "securityCode:0510"])
パスワード リセット機能のカスタマイズされた署名は次のようになります。
resetFunc({username, password, token, tokenId, currentPasswordValid}, securityAnswer1, securityAnswer2, securitySMSCode)
カスタム パスワード リセット関数では、最初のパラメーターとしてオブジェクトを渡す必要があります。以下の表は、このオブジェクトのフィールドを説明したものです。
フィールド | 説明 |
---|---|
username | ユーザーのメールアドレス。 |
password | ユーザーに対して新たに提案されたパスワード。この関数が成功ステータスを返す場合、これがユーザーの新しいパスワードになります。 |
token | ユーザーのパスワードを更新するために使用されるユニークな値。 |
tokenId | SDK confirmUser 関数を使用してユーザーの ID を確認するために使用されるユニークな値。 |
currentPasswordValid | ユーザが既存のパスワードへのリクエストした場合に true となるブール値。 |
カスタム パスワード リセット関数は、status
フィールドを含むオブジェクトを返す必要があります。この status
フィールドの値は、次のいずれかになります。
ステータス | パスワードのリセット状態 | SDK 効果 |
---|---|---|
success | App Services は、ユーザーのパスワードを指定された password パラメーターにただちに変更します。カスタム関数でユーザーの身元を認証する場合にのみ success を返します。セキュリティの質問やその他の安全な手段を使用してこれを行えます。 | カスタム関数呼び出しが success を返す場合、クライアントアプリはエラーがないことをパスワードのリセットが成功したものと解釈できます。ユーザーは新しいパスワードを使用してサインインできます。 |
pending | Atlas App Services は、クライアントアプリケーションがパスワードのリセットを完了するための追加アクションを実行するまで待機します。たとえば、カスタム パスワード リセット機能は、ユーザーの身元を確認するために、メールまたは SMS 経由で token と tokenId を送信する場合があります。 | この関数を呼び出す SDK メソッドは戻り値を受け取らないため、 pending ケースは直接取り扱われません。パスワード リセット プロセスを完了するには、アプリケーションにカスタム ロジックを実装する必要があります。たとえば、クライアントにディープ リンクまたはユニバーサル リンクを実装して token と tokenId を抽出し、 resetPassword メソッドを呼び出してリセットを完了できます。 |
fail | 何も起こりません。 | SDK は、カスタム パスワード リセット関数を呼び出すときに、返された fail をエラーまたは例外として解釈します。 |
カスタム パスワード リセット機能には、次の例のような要素が含まれる場合があります。
exports = ({ token, tokenId, username, password, currentPasswordValid }) => { // check if the username corresponds to a real user const isUser = myCustomValidator.validate(username); // check if the user is attempting to reset their password to their current password if (currentPasswordValid) { myCustomNotifier.sendMessage(username, "Cannot reset password to current password."); return { status: 'fail' }; } // check if the user has requested a password reset too often recently const isNotCoolingDown = myCustomCooldownService.canReset(username, 'myCustomService') // send a message to the user in some way so that the user can confirm themselves const msgSendSuccessful = isUser && isNotCoolingDown && myCustomMsgr.send(username, token, tokenId) if ( msgSendSuccessful ) { return { status: 'pending' }; } else { return { status: 'fail' }; } }
例
メール/パスワード認証を使用した登録、ログイン、パスワード リセットのフローの例は、Realm SDK を参照してください。
概要
Eメール/パスワード認証により、ユーザーはユーザー名とパスワードに基づいてアプリケーション内で ID を作成できます。
メール/パスワード認証を有効にするには、アプリケーションでメール確認と、ユーザーのパスワードのリセットの方法をサポートする必要があります。これらの要件ごとに、複数の実装オプションがあります。