メインコンテンツへスキップ
技術的な制約やユーザーエクスペリエンス上の理由により、エンドユーザーをリダイレクトする通常のフェデレーテッドログイン戦略を適用できない高度な統合シナリオでは、Custom Token Exchange を使用できます。これらのユースケース向けに提供されているコードは完全な実装ではなく、ユースケースに対応するためにコードで実装できる論理的な手順を示すことのみを目的としています。より詳細なコード例については、code samples を参照してください。
Auth0 では、可能な限り標準のフェデレーテッドログインをそのまま使用することを推奨しています。Custom Token Exchange ではトランザクションのユーザーを設定できるため、柔軟性が高まる一方で、トランザクションを安全に検証して処理する追加の責任も伴います。

ユースケース

このセクションでは、想定されるシナリオの実装に役立つ推奨事項と、具体的なコードサンプルを交えたユースケース例を紹介します。ユースケースの説明には、架空のレンタカーサービス会社である GearUp を使用します。

ユースケース: Auth0 へのシームレスな移行

GearUp は何百万人ものユーザーに利用されているモバイルアプリを提供しており、アイデンティティ基盤のモダナイゼーションのために Auth0 への移行を決定しました。ただし、レガシー IdP (IdP) からの移行時にユーザーへ再認証を強制すると、ユーザー体験に余計な負担が生じるため、それは避けたいと考えています。 この課題を解決し、あわせてリスクを抑えるために、GearUp は段階的に移行を進めています。各ユーザーについて、レガシー IdP のリフレッシュトークンを、Auth0 のアクセストークン、リフレッシュトークン、および のセットへ交換したいと考えています。これにより、アプリはこのユーザーに対して Auth0 を IdP としてシームレスに使い始められるようになり、同時に Auth0 が発行したトークンを使って GearUp API を利用できるようになります。すべてのユーザーでこの交換が完了すれば、アプリの移行は完全に終了し、古い IdP は切り離せます。しかも、その過程でエンドユーザーや GearUp のビジネスに影響を与えることはありません。
前提条件として、GearUp は Auth0 テナントに ユーザーの一括インポート を実施済みであり、モバイルアプリは移行対象の各ユーザーについて有効な従来のリフレッシュトークンを保持しています。
  1. モバイルアプリは Auth0 に対し、従来のリフレッシュトークンをサブジェクトトークンとして設定して交換を行うリクエストを送信します。
  2. 対応する Custom Token Exchange プロファイル Action が実行されます。この Action は、レガシー IdP に対してリフレッシュトークンを検証し、ユーザープロファイルから外部ユーザー ID を取得します。その後、必要な認可ポリシーを適用し、最後にユーザーを設定します。
  3. Auth0 は、Auth0 のアクセストークン、IDトークン、リフレッシュトークンを返します。
  4. これでモバイルアプリは、ユーザーに再認証を求めることなく、Auth0 トークンを使って Customer API を利用できるようになります。
次のコードサンプルは、これを Custom Token Exchange Action で実装する方法を示しています。このケースでは、ユーザープロファイルはすでに Auth0 のデータベース接続にインポートされています。
  • ユーザーは作成しません。
  • ユーザープロファイルは更新しません。
外部 IdP のユーザー ID を使用して、対応する接続内のユーザーを設定します。

ユースケース: 外部認証プロバイダーを再利用する

別のユースケースとして、GearUp が大手旅行プロバイダーである Air0 と提携し、Air0 のシングルページアプリケーション内で車両レンタルサービスを直接提供するケースがあります。GearUp は、自社 API の利用を抽象化した JavaScript ライブラリを提供しています。これにより、車両レンタルサービスを提供している Air0 の Web サイトから、GearUp の API を簡単に利用できます。 この場合も、GearUp への再認証を避けることで、エンドユーザーに意識させない形で実現する必要があります。この問題を解決するために、GearUp の JavaScript ライブラリは、外部の Air0 IDトークンを入力としてトークン交換を実行できます。これにより、対応する GearUp ユーザーのメールアドレスに基づいて生成され、そのユーザーに関連付けられた Auth0 アクセストークンが得られます。GearUp のライブラリがアクセストークンを取得すると、GearUp の API を使用して、Air0 の Web サイト内で車両レンタルサービスを直接提供できるようになります。
前提条件として、GearUp は Air0 IdP をフェデレーションされたエンタープライズ接続またはソーシャル接続として設定済みであるため、ユーザーはフェデレーションログイン、または次のように Custom Token Exchange を介して認証できます。
  1. シングルページアプリは、ユーザーの認証後に外部 IdP から IDトークンを取得します。
  2. 次に、その IDトークンをサブジェクトトークンとして設定し、交換をリクエストします。
  3. 対応する Custom Token Exchange プロファイル Action が実行されます。この Action は IDトークンを検証し、トークンからユーザー ID とその他のプロファイル属性を取得します。続いて必要な認可ポリシーを適用し、最後にユーザーを設定します。
  4. Auth0 は Auth0 アクセストークン、IDトークン、リフレッシュトークンを返します。
  5. これで、SPA で実行されている JavaScript コードは、ユーザーが再認証しなくても、Auth0 トークンを使用して Customer API を利用できます。
次のコードは、これを Custom Token Exchange Action で実装する方法の例です。このケースでは:
  • 外部 IdP のユーザー ID を使用して、対応する接続内のユーザーを設定します。
  • ユーザーがまだ存在しない場合は作成します。
  • ユーザーがすでに存在する場合は、フェデレーションログイン経由でより完全な属性セットが取得できても、ユーザープロファイルを置き換えません。
  • ユーザーの作成時にメールアドレスの検証は行いません。
コードサンプルで、を安全に検証する方法の、より詳しい例を確認できます。

ユースケース: 別のオーディエンス向けの Auth0 トークンを取得する

GearUp は、API リクエストを処理するために、内部マイクロサービス間の呼び出しの認可方法を改善したいと考えています。各サービスがアクセスできるリソースを一元的に制御するポリシーを導入したいと考えています。これも Token Exchange を使用して実現できます。 API リクエストが最初にサービス A に到達すると、サービス A は受け取ったアクセストークンを、サービス B を新しいオーディエンスとして利用できる新しいトークンに交換します。トークン交換を管理する認可ポリシーで許可されていれば、サービス A は新しいトークンを受け取り、サービス B を利用できるようになります。新しいトークンでもユーザー ID は変わらないため、プロセス全体を通じて適切なユーザーコンテキストが維持されます。
GearUp アプリケーションは、最初にユーザーに代わって API A を利用するためのアクセストークンを取得しています。
  1. アプリは、最初のアクセストークンを付けて API A にリクエストを送信します。
  2. API A のバックエンドサービスはアクセストークンを検証し、それをサービス B を利用するための新しいアクセストークンの サブジェクトトークン として設定して交換をリクエストします。
  3. 対応する Custom Token Exchange プロファイル Action が実行されます。これによりアクセストークンが検証され、トークンから Auth0 ユーザー ID が取得されます。その後、必要な認可ポリシーが適用され、最後にユーザーが設定されます。
  4. Auth0 は、API B のオーディエンスを利用するための Auth0 アクセストークンを返します。
  5. API A のバックエンドサービスは、新しいアクセストークンを使用して API B を呼び出します。このトークンは引き続き同じユーザーに関連付けられています。
次のコードは、Custom Token Exchange Action でこれを実装する方法を示しています。この場合:
  • ユーザーの設定には Auth0 ユーザー ID を使用するため、どの接続のスコープにもこれを設定する必要はありません。
  • ユーザーを作成または更新する必要はありません。
このユースケースの詳しいコードサンプルについては、非対称鍵で署名された JWT を検証する を参照してください。
JWT を安全に検証する方法の詳細な例については、コードサンプルを参照してください。

ユースケース: Custom Token Exchange 中に MFA を実行する

ユースケース: 外部認証プロバイダーを再利用する を踏まえ、GearUp は、外部認証プロバイダーのトークンが使用された際にユーザー本人の存在を確認したいと考えています。これは、トークンの盗難や、外部認証プロバイダーが MFA をサポートしていない場合などのセキュリティリスクを軽減するために必要です。GearUp には、これを実現するための選択肢が 2 つあります。組織全体に MFA ポリシーを適用するか、Post Login Action を使用して MFA をプログラムでトリガーする方法です。 次の例では、PostLogin Action を使用して、Custom Token Exchange トランザクション中に MFA 認証をトリガーします。埋め込み API で MFA grant を使用する方法の詳細については、Custom Token Exchange も同じモデルに従うため、MFA を使用した ROPG の利用に関するドキュメントを参照してください。 まず、api.multifactor.enable() を使用して MFA チャレンジをトリガーする Action を定義します。この関数については、Post Login API documentation で説明しています。
この結果、MFAトークンを含む mfa_required エラーが返されます。
返された mfa_token を使用して、アプリケーションは MFA API を呼び出し、認証要素へのチャレンジとその検証を行えます。 まず、認証要素の一覧を取得します。
次に、authenticator ID を使用してチャレンジを開始します。
チャレンジにより、次のレスポンスが返されます。
mfa_tokenoob_code (返された場合) を使用して、トークンエンドポイントで検証を完了し、トークンを受け取ります。
レガシーIdPで不透明なリフレッシュトークンを検証する方法の詳細な例については、コードサンプルを参照してください。

ユースケース: エンドユーザーに代わって操作するサポート担当者

GearUp のサポート担当者は、エンドユーザーに代わって GearUp のバックエンド API 経由でエンドユーザーのデータにアクセスし、操作を実行する必要があります。サポートツールはまず担当者を認証し、その後 Custom Token Exchange を使用して、担当者をアクターとして追跡しながらエンドユーザーを表すアクセストークンを取得します。
このケースでは、担当者の Auth0 IDトークンがリクエストの actor_token として送信され、エンドユーザーを識別する署名付き JWT が subject_token として送信されます。actor_token_typeurn: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トークンにのみ適用されます。
  1. サポートツールは Auth0 で担当者を認証し、担当者の IDトークンを取得します。
  2. サポートツールは、Custom Token Exchange リクエストを使用して Auth0 の /oauth/token を呼び出し、subject_token としてエンドユーザーの識別子を含む署名付き JWT と、actor_token として担当者の IDトークンを含めます。
  3. Custom Token Exchange Action が サブジェクトトークン を検証し、アクターにエンドユーザーに代わって操作する権限があることを確認したうえで、api.authentication.setActor() を呼び出します。
  4. Auth0 は、サポート担当者を識別する act クレームを含むトークンを発行します。
  5. サポート担当者はエンドユーザーに代わって API を利用します。API は act クレームを確認して、書き込み操作の制限や監査目的でのアクティビティの記録など、委任アクセスに固有の認可ポリシーを適用できます。
Custom Token Exchange Action では、カスタムプロパティやネストの深さを含め、actor オブジェクトに何を含めるかを決定できます。制約については、Custom Token Exchange API Object のドキュメントを参照してください。
発行されるアクセストークンには、act クレームが含まれます。

委任認可に関する重要な考慮事項

Custom Token Exchange で委任認可を実装する場合は、次のガイドラインに従ってください。
  • 特定のユーザーアカウントにアクセスする権限がアクターにあることを検証する認可ロジックを、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、またはダウンストリームサービス内に通知ロジックを実装できます。

コードサンプル

以下のコードサンプルでは、受信したサブジェクトトークンを安全かつ高性能に検証する際の、一般的なシナリオにおけるベストプラクティスを示します。 可能であれば、常に非対称アルゴリズムと鍵を使用してください。これにより、Auth0 とシークレットを共有する必要がありません。また、適用可能な公開鍵を公開する JWKS URI エンドポイントを提供する場合など、鍵のローテーションも簡素化されます。
サブジェクトトークンが、強力なアルゴリズムと十分なエントロピーを持つ鍵またはシークレットで保護されていることを確実にする責任は、お客様にあります。

非対称鍵で署名されたJWTを検証する

次の推奨事項に従ってください。
  • トランザクションごとに署名鍵を取得しなくて済むよう、Actions の api.cache () メソッドを使用します。
  • RFC8725 のベストプラクティスに従います
  • RS*、PS*、ES*、または Ed25519 アルゴリズムを使用します
  • none アルゴリズムは使用または受け入れないでください
  • 2048 ビット以上の RSA を使用します。

対称鍵で署名された JWT を検証する

次の推奨事項に従ってください。
  • 対称シークレットを安全に保存するには、Actions Secrets を使用します。
  • RFC8725 のベストプラクティスに従います。
  • HS256 などの安全なアルゴリズムを、エントロピーの高いランダムなシークレット (例: 少なくとも 256 ビット長) と併せて使用します。

外部サービスで不透明トークンを検証する

外部 IdP のを安全に保存するには、Action Secrets を使用します。