12.2. 内部トークンから内部トークンへの交換
内部のトークンからトークンへの交換では、特定のクライアントに作成された既存のトークンがあり、このトークンを別のターゲットクライアントに作成された新しいトークンと交換する必要があります。これを実行する理由これは通常、クライアントが自身のために作成したトークンを持っており、アクセストークン内で異なるクレームとパーミッションを必要とする他のアプリケーションに追加の要求を行う必要がある場合に発生します。このタイプの交換が必要となるかもしれないその他の理由は、アプリが信頼性の低いアプリで呼び出す必要があり、現在のアクセストークンを伝播したくない場合の "パーミッションのダウングレード" を実行する必要がある場合です。
12.2.1. 交換のパーミッションの付与 リンクのコピーリンクがクリップボードにコピーされました!
別のクライアントのトークンを交換する必要のあるクライアントは、管理コンソールで認可される必要があります。交換するパーミッションを付与するクライアントに、token-exchange の細かいパーミッションを定義する必要があります。
図12.1 ターゲットクライアントパーミッション
手順
Permissions Enabled を On に切り替えます。
図12.2 ターゲットクライアントパーミッション
そのページには、token-exchange のリンクが表示されます。
そのリンクをクリックして、パーミッションの定義を開始します。
このセットアップページが表示されます。
図12.3 ターゲットクライアント交換のパーミッション設定
- 画面上部のブレッドクラムで Client details をクリックします。
- このパーミッションのポリシーを定義します。
- 画面上部のブレッドクラムで Authorization をクリックします。
- このパーミッションのポリシーを定義します。
- Policies タブをクリックします。
Create policy ボタンをクリックして Client を作成します。
図12.4 クライアントポリシーの作成
- トークン交換を要求する認証されたクライアントである、開始クライアントを入力します。
このポリシーを作成したら、ターゲットクライアントの token-exchange パーミッションに戻り、定義したクライアントポリシーを追加します。
図12.5 クライアントポリシーの適用
これでクライアントを呼び出すパーミッションがある。これを正しく行わないと、エクスチェンジを作成しようとすると、403 Forbidden 応答が返されます。
12.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/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
}