Auth0 では、可能な限り通常の標準的なフェデレーテッドログインを使用することを推奨しています。カスタムトークン交換ではトランザクションに対してユーザーを設定できるため、柔軟性が高まる一方で、トランザクションを安全に検証し処理する追加の責任も伴います。
ユースケース
ユースケース: Auth0 へのシームレスな移行

- モバイルアプリは、レガシー リフレッシュトークンをサブジェクトトークンとして設定し、それを交換するためのリクエストを Auth0 に送信します。
- 対応するカスタムトークン交換プロファイルの Action が実行されます。この Action は、レガシー IdP でリフレッシュトークンを検証し、ユーザープロファイルから外部ユーザー ID を取得します。次に、必要な認可ポリシーを適用し、最後にユーザーを設定します。
- Auth0 は Auth0 アクセストークン、ID トークン、リフレッシュトークンを返します。
- これでモバイルアプリは、ユーザーが再認証しなくても、Auth0 トークンを使って顧客向け API を利用できるようになります。
- ユーザーは作成したくありません。
- ユーザープロファイルは更新したくありません。
ユースケース: 外部認証プロバイダーを再利用する

- ユーザーが認証されると、シングルページアプリケーションは外部 IdP から ID トークンを取得します。
- 次に、その ID トークンをサブジェクトトークンとして設定し、交換をリクエストします。
- 対応するカスタムトークン交換プロファイル Action が実行されます。この Action は ID トークンを検証し、トークンから user ID やその他のプロファイル属性を取得します。続いて必要な認可ポリシーを適用し、最後にユーザーを設定します。
- Auth0 は、Auth0 アクセストークン、ID トークン、およびリフレッシュトークンを返します。
- これで、SPA 上で実行されている JavaScript コードは、ユーザーが再認証しなくても、Auth0 トークンを使って Customer API を利用できます。
- 外部 IdP の user ID を使用して、対応する接続内のユーザーを設定します。
- ユーザーがまだ存在しない場合は、作成します。
- ユーザーがすでに存在する場合は、フェデレーションログインによってより完全な属性セットが取得される可能性があるため、ユーザープロファイルを置き換えたくありません。
- ユーザー作成時にメール確認は行いたくありません。
ユースケース: 別の audience 向けの Auth0 トークンを取得する

- アプリが最初のアクセストークンを付けて API A にリクエストを送信します。
- API A のバックエンドサービスがアクセストークンを検証し、それを API B を利用するための新しいアクセストークンのサブジェクトトークンとして設定して、交換をリクエストします。
- 対応するカスタムトークン交換プロファイル Action が実行されます。アクセストークンを検証し、トークンから Auth0 user ID を取得します。次に必要な認可ポリシーを適用し、最後にユーザーを設定します。
- Auth0 は、API B の audience を利用するための Auth0 アクセストークンを返します。
- API A のバックエンドサービスは、新しいアクセストークンを使って API B を呼び出します。このトークンは引き続き同じユーザーに関連付けられています。
- ユーザーの設定には Auth0 user ID を使用するため、どの接続のスコープでもこれを設定する必要はありません。
- ユーザーを作成または更新したくありません。
ユースケース: カスタムトークン交換中にMFAを実行する
api.multifactor.enable() を使用して MFA チャレンジをトリガーする Action を定義します。この関数については、Post Login API ドキュメントで説明されています。
mfa_required エラーが発生します:
mfa_token を使用して、アプリケーションは MFA API を呼び出し、認証要素に対するチャレンジの実行と検証を行えます。
まず、認証器の一覧を取得します。
mfa_token と oob_code (返された場合) を使用して、トークンエンドポイントで検証を完了し、トークンを取得します:
ユースケース: API を介してエンドユーザーに代わって操作するサポート担当者

actor_token として送信され、エンドユーザーを識別する署名付き JWT が subject_token として送信されます。actor_token_type が urn:ietf:params:oauth:token-type:id_token に設定されている場合、Auth0 はトークン (署名、有効期限、発行者) を自動的に検証し、担当者のプロファイルを event.transaction.actor_token_user に設定します。これにより、actor_token 用のカスタムバリデーションコードは不要になります。
actor_token として Auth0 ID トークンを使うことは必須ではありません。actor_token_type がカスタム値の場合、Action はサブジェクトトークンの検証と同様に、カスタムコードで actor_token を検証する必要があります。event.transaction.actor_token_user への自動設定が適用されるのは、Auth0 ID トークンだけです。- サポートツールは Auth0 で担当者を認証し、担当者の ID トークンを取得します。
- サポートツールは カスタムトークン交換リクエスト を使用して Auth0 の
/oauth/tokenを呼び出し、エンドユーザーの識別子をsubject_tokenとして含む署名付き JWT と、担当者の ID トークンをactor_tokenとして含めます。 - カスタムトークン交換 Action はサブジェクトトークンを検証し、actor がエンドユーザーに代わって操作する権限を持っていることを確認したうえで、
api.authentication.setActor()を呼び出します。 - Auth0 は、サポート担当者を識別する
actクレームを含むトークンを発行します。 - サポート担当者はエンドユーザーに代わって API を利用します。API は
actクレームを確認することで、委譲アクセスに固有の認可ポリシーを適用できます。たとえば、書き込み操作を制限したり、監査目的でアクティビティをログに記録したりできます。
actクレームが含まれます:
- カスタムトークン交換 Action 内に認可ロジックを実装し、actor が特定のユーザーアカウントにアクセスする権限を持っていることを検証します。たとえば、委譲アクセスを実行できるのは特定の actor のみとする認可判断を実装したり、任意のユーザーアクセスを防ぐために、対象ユーザーに有効なサポートチケットがあることを確認したりできます。
- 要求されたスコープを検証し、委譲認可に必要な最小限のスコープだけが発行されるようにします。機密性の高い一部の操作については、委譲認可のコンテキストでは決して実行できないようにしたい場合もあります。
-
API がアクセストークンの
actクレームに含まれる委譲コンテキストを利用するようにしてください。委譲された actor によって実行された操作の監査ログを API に保持し、どの actor がユーザーに代わって操作を実行したのかを明確に監査できるようにしておく必要があります。 -
監査の目的で、Auth0 テナントログ内の actor の詳細を利用できます。成功したカスタムトークン交換トランザクション (
secteログイベント) には、subとネストされたactor情報を含むactorプロパティが含まれます。
ユーザーに代わって委譲認可トークンが発行されても、Auth0 からエンドユーザーに通知されることはありません。ユースケース上、委譲アクセスの実行前にユーザーへの通知や明示的な同意が必要な場合は、トークン交換を実行する前にエンドユーザーのデバイスへ同意リクエストをプッシュするために、Client Initiated Backchannel Authentication (CIBA) の使用を検討してください。よりシンプルな通知要件であれば、カスタムトークン交換 Action、Post-Login Action、またはダウンストリームサービス内に通知ロジックを実装できます。
ユースケース: エンドユーザーに代わって Web アプリケーションにアクセスするサポートエージェント

- サポートツールは Auth0 でエージェントを認証し、エージェントの ID トークンを取得します。
- サポートツールは、カスタムトークン交換リクエストを使用して Auth0 の
/oauth/tokenを呼び出します。このとき、audienceをurn:YOUR_AUTH0_TENANT_DOMAIN:session_transferに設定し、エンドユーザーを識別する署名付き JWT をsubject_tokenとして、エージェントの ID トークンをactor_tokenとして指定します。 - 関連付けられた カスタムトークン交換 Action はサブジェクトトークンを検証し、委譲を認可したうえで、
api.authentication.setActor()とapi.authentication.setUserByConnection()を呼び出し、対象アプリケーションが受け入れる接続を選択します。Session Transfer Token をリクエストする場合、setActor()の呼び出しは必須です。省略すると400エラーが返されます。 - Auth0 はアクセストークンではなく、Session Transfer Token (
issued_token_type: urn:auth0:params:oauth:token-type:session_transfer_token) を発行します。 - サポートツールは、GearUp の
initiate_login_uriのクエリパラメータとして Session Transfer Token を渡し、エージェントのブラウザーを GearUp の Web アプリケーションにリダイレクトします。 - GearUp の Web アプリケーションは、Session Transfer Token を Auth0 の
/authorizeエンドポイントに対する独自の呼び出しにそのまま渡します。このエンドポイントはトークンを検証し、監査用にエージェントを actor として記録したうえで、エンドユーザー用の一時的で有効期間が限られたセッションを確立します。リクエストとレスポンスの詳細については、Implement Session Delegationを参照してください。
Web アプリケーションは、委任セッションを受け入れるよう明示的にオプトインする必要があります。また、セッションの動作の一部は通常のログインと異なります (セッションの有効期間、リフレッシュトークン、MFA など) 。Web アプリケーションの設定方法、これらの動作や制限事項、委任セッションの監査方法については、Session Delegationを参照してください。
audience を確認して、セッション委譲リクエストと通常の API アクセスリクエストを区別し、それぞれに異なる認可ポリシーを適用します。次に、actor とユーザーを設定します。Auth0 は、Action のロジックではなく、リクエストされた audience に基づいてアクセストークンと Session Transfer Token のどちらを発行するかを決定します。
セッション委譲に関する重要な考慮事項
session_transferaudience に基づいてセッション委譲リクエストを検出し、その場合に固有の認可ポリシーを適用します。- 対象アプリケーションに到達できるかどうかは、Action で設定する接続によって異なります。
- 接続を設定するには、カスタムトークン交換を呼び出すアプリケーションが、対象アプリケーションと同じ接続にアクセスできる必要があります。
- 共有ドメイン上の既存のセッションによって委譲先のセッションがブロックされないよう、開始元と対象のアプリケーションにはそれぞれ異なる Auth0 ドメインを使用してください。
- エージェントは、異なるユーザーの委譲セッションの間にログアウトする必要があります。
Code samples
サブジェクトトークンが強力なアルゴリズムで保護され、キーやシークレットに十分なエントロピーがあることを確保するのは、お客様の責任です。
非対称鍵で署名された JWT を検証する
- トランザクションごとに署名鍵を毎回取得しなくて済むよう、Actions の
api.cache ()メソッドを使用します。 - RFC8725 のベストプラクティスに従います
- RS*、PS*、ES*、または Ed25519 の algorithms を使用します
- none アルゴリズムは使用せず、受け入れないでください
- 2048 ビット以上の RSA を使用します。
対称キーで署名された JWT を検証する
- Actions Secrets を使用して、対称シークレットを安全に保存します。
- RFC8725 のベストプラクティスに従います
- HS256 などの安全なアルゴリズムを使用し、十分なエントロピーを持つランダムなシークレット (例: 少なくとも 256 ビット長) を併用します