第12章 トークン交換の使用
トークン交換は プレビュー であり、完全にはサポートされていません。この機能はデフォルトで無効化されています。
有効にするには、--features=preview または --features=token-exchange でサーバーを起動します。
トークンの交換は テクノロジープレビュー であるため、完全にサポートされていません。
内部トークンから内部トークンへの交換 フロー以上のものを使用するには、admin-fine-grained-authz 機能も有効にします。詳細は、機能の有効化と無効化 の章を参照してください。
12.1. トークン交換の仕組み リンクのコピーリンクがクリップボードにコピーされました!
Red Hat build of Keycloak では、トークン交換とは、一連の認証情報またはトークンを使用してまったく異なるトークンを取得するプロセスのことです。クライアントは、信頼性の低いアプリケーションで呼び出したい場合があるため、現在のトークンをダウングレードしたい場合があります。クライアントは、Red Hat build of Keycloak トークンを、リンクされたソーシャルプロバイダーアカウント用に保存されているトークンと交換することを推奨します。他の Red Hat build of Keycloak レルムまたは外部 IDP によって生成された外部トークンを信頼することを推奨します。クライアントでは、ユーザーの権限を借用しなければならない場合があります。以下は、トークン交換に関する Red Hat build of Keycloak の現行機能に関する概要です。
- クライアントは、特定のクライアント用に作成された既存の Red Hat build of Keycloak トークンを、別のクライアントを対象とした新しいトークンと交換できます。
- クライアントは、既存の Red Hat build of Keycloak トークンを外部トークン (リンクされた Facebook アカウントなど) と交換できます。
- クライアントが外部トークンを Red Hat build of Keycloak トークンと交換できる。
- クライアントはユーザーの権限を借用できます。
Red Hat build of Keycloak におけるトークン交換は、IETF の OAuth トークン交換 仕様の非常に緩い実装です。この仕様を少し拡張し、一部を無視して、他の部分は大まかに解釈しました。これは、レルムの OpenID Connect トークンエンドポイントにおける単純な付与タイプ呼び出しです。
/realms/{realm}/protocol/openid-connect/token
/realms/{realm}/protocol/openid-connect/token
これは、フォームパラメーター (application/x-www-form-urlencoded) を入力として受け付け、出力は交換を要求したトークンのタイプによって異なります。トークン交換はクライアントエンドポイントであるため、リクエストは呼び出し元のクライアントに対して認証情報を提供する必要があります。パブリッククライアントは、クライアント識別子を form パラメーターとして指定します。機密クライアントは、フォームパラメーターを使用して、クライアント ID とシークレット、Basic 認証、または管理者がレルムで設定したクライアント認証フローを渡すこともできます。
12.1.1. フォームパラメーター リンクのコピーリンクがクリップボードにコピーされました!
- client_id
- 必須の可能性あり。このパラメーターは、認証にフォームパラメーターを使用するクライアントに必要です。Basic 認証、クライアント JWT トークン、またはクライアント証明書認証を使用している場合は、このパラメーターを指定しないでください。
- client_secret
- 必須の可能性あり。このパラメーターは、認証にフォームパラメーターを使用し、認証情報としてクライアントシークレットを使用するクライアントに必要です。レルムのクライアント呼び出しが別の手段で認証されている場合は、このパラメーターは指定しないでください。
- grant_type
-
必須。パラメーターの値は
urn:ietf:params:oauth:grant-type:token-exchangeにする必要があります。 - subject_token
- 任意。リクエストが行われている当事者の ID を表すセキュリティートークン。これは、既存のトークンを新しいトークンと交換する場合に必要です。
- subject_issuer
-
任意。
subject_tokenの発行者を特定します。トークンが現在のレルムから送信される場合や、発行者がsubject_token_typeから判断できる場合は空白のままにすることができます。それ以外の場合は指定する必要があります。有効な値は、レルムに設定されたID プロバイダーのエイリアスです。または、特定のID プロバイダーによって設定された発行者要求 ID です。 - subject_token_type
-
任意。このパラメーターは、
subject_tokenパラメーターで渡されるトークンのタイプです。subject_tokenがレルムから取得され、アクセストークンである場合、デフォルトはurn:ietf:params:oauth:token-type:access_tokenに設定されます。外部トークンの場合には、subject_issuerの要件に応じてこのパラメーターを指定する必要がある場合とそうでない場合があります。 - requested_token_type
-
任意。このパラメーターは、クライアントが交換するトークンのタイプを表します。現在、oauth および OpenID Connect トークンタイプのみがサポートされます。このデフォルト値は
urn:ietf:params:oauth:token-type:refresh_tokenであるかどうかによって異なります。この場合、応答内でアクセストークンとリフレッシュトークンの両方が返されます。その他の適切な値は、urn:ietf:params:oauth:token-type:access_tokenおよびurn:ietf:params:oauth:token-type:id_tokenです。 - audience
- 任意。このパラメーターは、新しいトークンを作成するターゲットクライアントを指定します。
- requested_issuer
-
任意。このパラメーターは、クライアントが外部プロバイダーによって作成されたトークンを必要とすることを指定します。レルム内で設定された
ID プロバイダーのエイリアスである必要があります。 - requested_subject
- 任意。これは、クライアントが別のユーザーになりすます場合のユーザー名またはユーザー ID を指定します。
- scope
- 任意。このパラメーターは、クライアントが要求する OAuth および OpenID Connect スコープのターゲットセットを表します。返されるスコープは、スコープパラメーターとアクセストークンスコープのカルテジアン積です。
現在、OpenID Connect および OAuth の交換のみをサポートします。SAML ベースのクライアントおよびアイデンティティープロバイダーのサポートは、ユーザーの需要に応じて今後追加される可能性があります。
12.1.2. トークン交換要求からの応答 リンクのコピーリンクがクリップボードにコピーされました!
交換呼び出しからの正常な応答は、クライアントが要求する requested-token-type と requested_issuer に依存するコンテンツタイプを含む HTTP 200 応答コードを返します。OAuth が要求するトークンタイプは、OAuth Token Exchange 仕様で説明されているように、JSON ドキュメントを返します。
{
"access_token" : ".....",
"refresh_token" : ".....",
"expires_in" : "...."
}
{
"access_token" : ".....",
"refresh_token" : ".....",
"expires_in" : "...."
}
リフレッシュトークンを要求するクライアントは、応答でアクセストークンとリフレッシュトークンの両方を返します。アクセストークンタイプのみを要求するクライアントは、応答でアクセストークンのみを取得します。requested_issuer パラメーターを介して外部発行者を要求するクライアントの有効期限情報は、含まれる場合とそうでない場合があります。
通常、エラー応答は 400 HTTP 応答コードカテゴリーに分類されますが、エラーの重大度に応じて他のエラーステータスコードが返される場合があります。エラー応答には、requested_issuer に依存するコンテンツが含まれる場合があります。OAuth ベースの交換では、以下のように JSON ドキュメントが返される場合があります。
{
"error" : "...."
"error_description" : "...."
}
{
"error" : "...."
"error_description" : "...."
}
交換タイプに応じて、追加のエラークレームを返すことができます。たとえば、ユーザーに ID プロバイダーへのリンクがない場合に、OAuth ID プロバイダーには追加の account-link-url 要求が含まれる場合があります。このリンクは、クライアントが開始したリンク要求に使用できます。
トークンの交換のセットアップには、きめ細かな管理パーミッションに関する知識が必要です (詳細は、サーバー管理ガイド を参照)。交換にクライアントパーミッションを付与する必要があります。これは、この章で後ほど説明します。
この章の残りの部分では、セットアップ要件を説明し、さまざまな交換シナリオの例を示します。分かりやすくするために、現在のレルムで作成された最小のトークンを 内部 トークンとして呼び出し、外部レルムまたは ID プロバイダーによって作成されたトークンを 外部 トークンと呼ぶことにします。