- カスタムのプライバシーポリシーへの同意取得、利用規約の提示、データ開示フォームの表示を行う。
- 追加で必要なプロファイルデータを、安全に一度だけ収集する。
- リモートの Active Directory ユーザーがパスワードを変更できるようにする。
- 不明な場所からログインしたユーザーに、追加の本人確認を求める。
- 初回のサインアップ時に提供された情報に加えて、ユーザーに関する詳細情報を収集する。
概要
- Action が URL へのリダイレクトを発行します。
- その Action の実行が完了すると、Actions パイプラインは中断されます。
- ユーザーは
stateパラメーターとともにその URL にリダイレクトされます。 - 外部フローが完了すると、外部サイトは
stateパラメーターとともにユーザーを/continueエンドポイントにリダイレクトします。 - Actions パイプラインは、リダイレクトを呼び出した同じ Action から再開されます。
リダイレクトを開始する
api.redirect.sendUserTo() 関数を呼び出します。
https://my-app.exampleco.com にリダイレクトします。つまり、リダイレクトを呼び出した Action の後に実行される post-login トリガーにバインドされている Actions は、認証フローが再開されるまで実行されません。Redirect Rules に慣れている場合は、これが Redirect Actions と Redirect Rules の重要な違いであることに注意してください。
Redirect Rules とは異なり、Redirect Actions はリダイレクトが発行されると Actions パイプラインを中断し、認証フローが再開されると、リダイレクトを発行した同じ Action から再開されます。
api.redirect.sendUserTo() 関数で指定された URL にユーザーをリダイレクトします。Auth0 はその URL に state パラメーターも渡します。例:
https://my-app.exampleco.com/?state=abc123
認証トランザクションを再開するには、リダイレクト URL から state パラメーターを取得し、それを Auth0 に送り返す必要があります。state は、クロスサイトリクエストフォージェリ (CSRF) 攻撃を防ぐために使われる opaque な値です。
認証フローを再開する
/continue エンドポイントにリダイレクトし、受け取った state パラメーターを URL に含めて認証を再開します。元の state を /continue エンドポイントに返送しないと、Auth0 はログイントランザクションのコンテキストを失い、ユーザーは invalid_request エラーのためログインできなくなります。
たとえば、次のようになります。
https://{yourAuth0Domain}/continue?state=THE_ORIGINAL_STATE
この例では、THE_ORIGINAL_STATE は Auth0 が生成し、リダイレクト URL に送信した値です。たとえば、Action が https://my-app.exampleco.com/ にリダイレクトする場合、Auth0 は https://my-app.exampleco.com/?state=abc123 のようなリダイレクト URL を使用するため、abc123 が THE_ORIGINAL_STATE になります。認証トランザクションを再開するには、次の URL にリダイレクトします。
https://{yourAuth0Domain}/continue?state=abc123
ユーザーが /continue エンドポイントにリダイレクトされると、Actions パイプラインは、リダイレクトを呼び出した同じ Action で onContinuePostLogin 関数を呼び出して再開されます。リダイレクトを正しく機能させるには、リダイレクトを呼び出したのと同じ Action に、次のシグネチャを持つ関数が必要です。
外部サイトにデータを渡す
api.redirect.encodeToken 関数と api.redirect.sendUserTo 関数で実現できます。
session_token クエリ文字列パラメーターを追加します (Auth0 によって自動的に追加される state パラメーターに加えて) 。このトークンには、次の情報が含まれます。
token が改ざんされていないことを確認する
sub クレーム に含まれる Auth0 ユーザーと同一ユーザーのものであることを確認する必要があります。
データを Auth0 に返す
/continue エンドポイントにリダイレクトする必要があります。状況によっては、そのユーザーの認証や に影響を与えるため、データを Auth0 に返したい場合があります (たとえば、CAPTCHA チェックやカスタム を実装している場合) 。
可能であればアプリのメタデータを使用する
event.user.app_metadata オブジェクトで利用できるようになります。この方法なら、機密情報をフロントチャネル経由で Auth0 に渡さずに済みます。
Auth0 ユーザープロファイルに保存するデータは必要最小限にしてください
フロントチャネルでデータを送信する
情報を Action に渡す
- 署名が有効であること。
- トークンの有効期限が切れていないこと。
- トークン内の
stateクレームが、リダイレクトの一部として使用されるstateパラメーターと一致すること。
リプレイ攻撃を防ぐため、トークンは
/continue エンドポイントに POST リクエストを送信して Auth0 に返す必要があります。コード内の tokenParameterName オプションを使用すると、トークンを含むフィールド名を指定できます。
独自の認証方法
event.authentication.methods 配列には、ユーザーのブラウザーセッションの間、この独自の認証方法のエントリが保持されます。この配列内の各エントリには、その認証方法が記録された時刻を示すタイムスタンプがあります。
必要な独自の認証方法が event.authentication.methods 配列に存在しない場合や、そのエントリが古すぎる場合は、カスタム Action でリダイレクトをトリガーできます。
api.redirect.sendUserTo() を使用すると、独自の認証方法を実装するページにユーザーを遷移させることができます。exports.onContinuePostLogin ハンドラー内で api.authentication.recordMethod() を使用すると、完了した認証方法の記録をユーザーのセッションに保存できます。
event.authentication.methods 配列に保存される記録には、api.authentication.recordMethod() で選択した URL に一致する name プロパティが含まれます。ここで記録された URL を使うと、現在のトランザクションで完了した認証方法を確認し、独自の認証方法がすでに完了しているかどうかを判断できます。
ワークフローによっては、ユーザーのセッションの有効期間中、独自の認証方法を定期的に再実行する必要がある場合があります。たとえば、独自の MFA シナリオでは、一定時間経過後にユーザーの本人確認を再度求める必要が生じることがあります。
次の例では、既存の記録のタイムスタンプを比較して、独自の認証方法をいつ再実行するかを判断しています。
api.authentication.recordMethod() API は、exports.onContinuePostLogin ハンドラーでのみ利用できます。これにより、リダイレクトの完了後にカスタムメソッドを記録することで、ログイン時の不正利用の可能性を防げます。
制約と制限
リソース所有者エンドポイント
prompt=none のフロー
prompt=none の目的は、ユーザーに入力を求める状況を一切発生させないことにあるため、どのようなリダイレクトでも error=interaction_required になります。
Actions は認証セッションの作成後に実行されるため、特定の条件下でトークンへのアクセスをブロックしようとするリダイレクトルールがある場合は、prompt=none を使用できません (たとえば、カスタム MFA やログイン時の CAPTCHA など) 。
prompt=none を使用する場合、トークンへのアクセスをブロックしつつ、リダイレクト Action を回避できるようなリダイレクトフローは作成できません。試行が失敗した後でも、ユーザーは単に prompt=none を付けて再度呼び出すだけでトークンを取得できてしまうためです。これは、最初に Actions が失敗していても、認証セッション自体はすでに作成されているからです。
リフレッシュトークン
prompt=none はまったく使用できません。
Action で api.redirect.sendUserTo() が呼び出されるたびに、prompt=none が渡されていた場合、認可は error=interaction_required で失敗します。しかし、Actions が失敗してもユーザーのセッションは作成されるため、ユーザーがリダイレクトチャレンジを通過したことを信頼できず、その結果、トークンを取得する手段として prompt=none を使用できません。
この特定のケースでは、リフレッシュトークンの生成にそれらのチャレンジが必要であれば、ユーザーがチャレンジを通過したことを確実に確認できるため、リフレッシュトークンのみを使用することを推奨します。