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

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

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

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

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トークンを取得します。
- サポートツールは、Custom Token Exchange リクエストを使用して Auth0 の
/oauth/tokenを呼び出し、subject_tokenとしてエンドユーザーの識別子を含む署名付き JWT と、actor_tokenとして担当者の IDトークンを含めます。 - Custom Token Exchange Action が サブジェクトトークン を検証し、アクターにエンドユーザーに代わって操作する権限があることを確認したうえで、
api.authentication.setActor()を呼び出します。 - Auth0 は、サポート担当者を識別する
actクレームを含むトークンを発行します。 - サポート担当者はエンドユーザーに代わって API を利用します。API は
actクレームを確認して、書き込み操作の制限や監査目的でのアクティビティの記録など、委任アクセスに固有の認可ポリシーを適用できます。
act クレームが含まれます。
- 特定のユーザーアカウントにアクセスする権限がアクターにあることを検証する認可ロジックを、Custom Token Exchange Action 内に実装してください。たとえば、委任アクセスを実行できるのは特定のアクターのみとする認可判断を実装したり、不正なユーザーアクセスを防ぐために、対象ユーザーに有効なサポートチケットがあることを確認したりできます。
- 要求されたスコープを検証してください。委任認可に必要な最小限のスコープだけが発行されるようにするためです。機微な操作については、委任認可のコンテキストでは決して実行できないようにしたい場合もあります。
-
API でアクセストークンの
actクレームに含まれる委任コンテキストを利用するようにしてください。委任されたアクターが実行した操作の監査ログを API に保持し、ユーザーに代わってどのアクターが操作を実行したのかを明確に監査できるようにする必要があります。 -
監査目的では、Auth0 テナントログ内のアクター詳細を利用できます。成功した Custom Token Exchange トランザクション (
secteログイベント) には、subとネストされたactor情報を含むactorプロパティが含まれます。
Auth0 は、エンドユーザーに代わって委任認可トークンが発行されても、そのエンドユーザーには通知しません。委任アクセスの実行前にユーザーへの通知や明示的な同意が必要なユースケースでは、トークン交換を実行する前にエンドユーザーのデバイスへ同意リクエストを送信できる Client Initiated Backchannel Authentication (CIBA) の使用を検討してください。より簡易な通知要件であれば、Custom Token Exchange Action、Post-Login Action、またはダウンストリームサービス内に通知ロジックを実装できます。
コードサンプル
サブジェクトトークンが、強力なアルゴリズムと十分なエントロピーを持つ鍵またはシークレットで保護されていることを確実にする責任は、お客様にあります。
非対称鍵で署名されたJWTを検証する
- トランザクションごとに署名鍵を取得しなくて済むよう、Actions の
api.cache ()メソッドを使用します。 - RFC8725 のベストプラクティスに従います
- RS*、PS*、ES*、または Ed25519 アルゴリズムを使用します
- none アルゴリズムは使用または受け入れないでください
- 2048 ビット以上の RSA を使用します。
対称鍵で署名された JWT を検証する
- 対称シークレットを安全に保存するには、Actions Secrets を使用します。
- RFC8725 のベストプラクティスに従います。
- HS256 などの安全なアルゴリズムを、エントロピーの高いランダムなシークレット (例: 少なくとも 256 ビット長) と併せて使用します。