1.4. トークンの伝播
quarkus-oidc-token-propagation エクステンションは、認証情報の伝播を簡素化する 2 つの Jakarta REST jakarta.ws.rs.client.ClientRequestFilter クラス実装を提供します。io.quarkus.oidc.token.propagation.AccessTokenRequestFilter は、現在アクティブなリクエストに存在する ベアラートークン、または 認可コードフローメカニズム から取得されたトークンを、HTTP Authorization ヘッダーの Bearer スキーム値として伝播します。io.quarkus.oidc.token.propagation.JsonWebTokenRequestFilter は同じ機能を提供しますが、さらに JWT トークンのサポートも提供します。
現在の認可コードフローアクセストークンを伝播する必要がある場合は、即時トークン伝播が適切に機能します。これは、(ID トークンではなく) コードフローアクセストークンが、現在認証されているユーザーに代わってリモートサービスにアクセスするために現在の Quarkus エンドポイントに伝播されることを意図したものであるためです。
ただし、エンドツーエンドの Bearer トークンの直接的な伝播は回避する必要があります。たとえば、Client の場合、Service B は Client から Service A に送信されたトークンを受信します。このような場合、Service B はトークンが Service A から来たものか、Client から直接来たものか区別できません。トークンが Service A から送信されたことを Service B が確認するには、新しい発行者と audience クレームをアサートできる必要があります。
さらに、複雑なアプリケーションでは、トークンを伝播する前に交換または更新しないといけない場合があります。たとえば、Service A が Service B にアクセスする場合、アクセスコンテキストが異なる場合があります。この場合、Service A には、Service B にアクセスするための狭い範囲またはまったく異なる範囲のセットが付与される可能性があります。
次のセクションでは、AccessTokenRequestFilter と JsonWebTokenRequestFilter がどのように役立つかを示します。
1.4.1. RestClient AccessTokenRequestFilter リンクのコピーリンクがクリップボードにコピーされました!
AccessTokenRequestFilter はすべてのトークンを文字列として扱うため、JWT トークンと不透明トークンの両方で動作します。
io.quarkus.oidc.token.propagation.AccessToken または org.eclipse.microprofile.rest.client.annotation.RegisterProvider のいずれかを使用して、AccessTokenRequestFilter を選択的に登録できます。次に例を示します。
あるいは、以下のような場合もあります。
または、quarkus.oidc-token-propagation.register-filter プロパティーが true に設定され、quarkus.oidc-token-propagation.json-web-token プロパティーが false (デフォルト値) に設定されている場合は、AccessTokenRequestFilter はすべての MP Rest または Jakarta REST クライアントに自動的に登録されます。
1.4.1.1. 伝播前のトークンの交換 リンクのコピーリンクがクリップボードにコピーされました!
現在のアクセストークンを伝播前に交換する必要があり、トークン交換 トークングラントをサポートする Keycloak またはその他の OpenID Connect Provider を使用する場合は、AccessTokenRequestFilter を次のように設定できます。
現在のトークンを交換するために JWT ベアラートークングラント を 使用する必要がある Azure などのプロバイダーを使用する場合は、次のように AccessTokenRequestFilter を設定してトークンを交換できます。
注記: AccessTokenRequestFilter は OidcClient を使用して現在のトークンを交換します。quarkus.oidc-client.grant-options.exchange を使用して、OpenID Connect Provider が期待する追加の交換プロパティーを設定できます。
AccessTokenRequestFilter はデフォルトの OidcClient を使用します。名前付き OidcClient は、quarkus.oidc-token-propagation.client-name 設定プロパティーを使用して選択できます。
1.4.2. RestClient JsonWebTokenRequestFilter リンクのコピーリンクがクリップボードにコピーされました!
Bearer JWT トークンを使用する場合、issuer や audience などのトークンのクレームを変更したり、更新されたトークンを再度保護 (再署名など) したりできる場合は、JsonWebTokenRequestFilter を使用することを推奨します。注入された org.eclipse.microprofile.jwt.JsonWebToken が想定されるため、不透明なトークンでは機能しません。また、OpenID Connect Provider が Token Exchange プロトコルをサポートしている場合は、代わりに AccessTokenRequestFilter を使用することを推奨します。AccessTokenRequestFilter を使用すると、JWT と不透明ベアラートークンの両方を安全に交換できるためです。
JsonWebTokenRequestFilter を使用すると、Service A の実装で、注入された org.eclipse.microprofile.jwt.JsonWebToken を新しい issuer と audience のクレーム値で簡単に更新し、更新されたトークンを新しい署名で再度保護できるようになります。唯一の難しいステップは、Service A に署名キーがあることを確認することです。署名キーは、安全なファイルシステムまたは Vault などのリモートの安全なストレージからプロビジョニングする必要があります。
io.quarkus.oidc.token.propagation.JsonWebToken または org.eclipse.microprofile.rest.client.annotation.RegisterProvider のいずれかを使用して、JsonWebTokenRequestFilter を選択的に登録できます。次に例を示します。
あるいは、以下のような場合もあります。
あるいは、quarkus.oidc-token-propagation.register-filter プロパティーと quarkus.oidc-token-propagation.json-web-token プロパティーの両方が true に設定されている場合、JsonWebTokenRequestFilter がすべての MicroProfile REST または Jakarta REST クライアントに自動的に登録できます。
1.4.2.1. 伝播前のトークンの更新 リンクのコピーリンクがクリップボードにコピーされました!
注入されたトークンの iss (issuer) または aud (audience) クレームを更新し、新しい署名で再度保護する必要がある場合は、次のように JsonWebTokenRequestFilter を設定できます。
前述のように、Keycloak または Token Exchange プロトコルをサポートする OpenID Connect Provider を使用する場合は、AccessTokenRequestFilter を使用します。
1.4.3. テスト リンクのコピーリンクがクリップボードにコピーされました!
OpenID Connect ベアラートークン結合テスト セクションの説明に従って、トークンを生成できます。REST テストエンドポイントを準備します。登録されたトークン伝播フィルターを備えた朝中された MP REST クライアントを使用するテストフロントエンドエンドポイントで、ダウンストリームエンドポイントを呼び出すことができます。たとえば、main Quarkus リポジトリーの integration-tests/oidc-token-propagation を参照してください。