7.2. 内部トークンから内部トークンへの交換
内部のトークンからトークンへの交換では、特定のクライアントに作成された既存のトークンがあり、このトークンを別のターゲットクライアントに作成された新しいトークンと交換する必要があります。これを実行する理由これは通常、クライアントが自身のために作成したトークンを持っており、アクセストークン内で異なるクレームとパーミッションを必要とする他のアプリケーションに追加の要求を行う必要がある場合に発生します。このタイプの交換が必要となるかもしれないその他の理由は、アプリが信頼性の低いアプリで呼び出す必要があり、現在のアクセストークンを伝播したくない場合のパーミッションのダウングレードを実行する必要がある場合です。
7.2.1. 交換のパーミッションの付与
別のクライアントのトークンを交換する必要のあるクライアントは、管理コンソールで認可される必要があります。交換するパーミッションを付与するクライアントに、token-exchange
の細かいパーミッションを定義する必要があります。
ターゲットクライアントパーミッション
手順
Permissions Enabled を ON に切り替えます。
ターゲットクライアントパーミッション
そのページには、token-exchange のリンクが表示されます。
そのリンクをクリックして、パーミッションの定義を開始します。
このセットアップページが表示されます。
ターゲットクライアント交換のパーミッション設定
- Authorization のリンクをクリックして、このパーミッションのポリシーを定義します。
- Policies タブをクリックします。
クライアントポリシーを作成します。
クライアントポリシーの作成
- トークン交換を要求する認証されたクライアントである、開始クライアントを入力します。
このポリシーを作成したら、ターゲットクライアントの token-exchange パーミッションに戻り、定義したクライアントポリシーを追加します。
クライアントポリシーの適用
これでクライアントを呼び出すパーミッションがある。これを正しく行わないと、エクスチェンジを作成しようとすると、403 Forbidden 応答が返されます。
7.2.2. リクエストの作成
クライアントが、既存のトークンを他のクライアントをターゲットにしたトークンと交換する場合は、audience
パラメーターを使用します。このパラメーターは、管理コンソールで設定したターゲットクライアントのクライアント識別子である必要があります。
curl -X POST \ -d "client_id=starting-client" \ -d "client_secret=the client secret" \ --data-urlencode "grant_type=urn:ietf:params:oauth:grant-type:token-exchange" \ -d "subject_token=...." \ --data-urlencode "requested_token_type=urn:ietf:params:oauth:token-type:refresh_token" \ -d "audience=target-client" \ http://localhost:8080/auth/realms/myrealm/protocol/openid-connect/token
curl -X POST \
-d "client_id=starting-client" \
-d "client_secret=the client secret" \
--data-urlencode "grant_type=urn:ietf:params:oauth:grant-type:token-exchange" \
-d "subject_token=...." \
--data-urlencode "requested_token_type=urn:ietf:params:oauth:token-type:refresh_token" \
-d "audience=target-client" \
http://localhost:8080/auth/realms/myrealm/protocol/openid-connect/token
subject_token
パラメーターは、ターゲットレルムのアクセストークンである必要があります。requested_token_type
パラメーターが更新トークンタイプである場合、応答にはアクセストークン、更新トークン、および有効期限が含まれます。以下は、この呼び出しから返される JSON 応答の例です。
audience
パラメーターが設定されていない場合に、パラメーターの値はデフォルトでトークン交換要求を行うクライアントに設定されます。
機密クライアントとは異なり、パブリッククライアントは他のクライアントからのトークンを使用してトークン交換を実行することはできません。subject_token
を指定する場合には、トークンを発行した (機密の) クライアントと、リクエストを行ったクライアントが同じである必要があります。別のクライアントに対して発行された場合には、リクエストを行ったクライアントは、トークンに設定されたオーディエンスに含まれている必要があります。
ターゲットの audience
(要求を行うクライアントとは別のクライアント) を明示的に設定する場合に、token-exchange
のスコープのパーミッションを audience
パラメーターに指定されたクライアントに設定して、クライアントが要求を出して交換が正常に完了するようにしてください。
{ "access_token" : "....", "refresh_token" : "....", "expires_in" : 3600 }
{
"access_token" : "....",
"refresh_token" : "....",
"expires_in" : 3600
}