7.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
がどのように役立つかを示します。
7.4.1. RestClient AccessTokenRequestFilter
AccessTokenRequestFilter
はすべてのトークンを文字列として扱うため、JWT トークンと不透明トークンの両方で動作します。
io.quarkus.oidc.token.propagation.AccessToken
または org.eclipse.microprofile.rest.client.annotation.RegisterProvider
のいずれかを使用して、AccessTokenRequestFilter
を選択的に登録できます。次に例を示します。
import org.eclipse.microprofile.rest.client.inject.RegisterRestClient; import io.quarkus.oidc.token.propagation.AccessToken; @RegisterRestClient @AccessToken @Path("/") public interface ProtectedResourceService { @GET String getUserName(); }
あるいは、以下のような場合もあります。
import org.eclipse.microprofile.rest.client.annotation.RegisterProvider; import org.eclipse.microprofile.rest.client.inject.RegisterRestClient; import io.quarkus.oidc.token.propagation.AccessTokenRequestFilter; @RegisterRestClient @RegisterProvider(AccessTokenRequestFilter.class) @Path("/") public interface ProtectedResourceService { @GET String getUserName(); }
または、quarkus.oidc-token-propagation.register-filter
プロパティーが true
に設定され、quarkus.oidc-token-propagation.json-web-token
プロパティーが false
(デフォルト値) に設定されている場合は、AccessTokenRequestFilter
はすべての MP Rest または Jakarta REST クライアントに自動的に登録されます。
7.4.1.1. 伝播前のトークンの交換
現在のアクセストークンを伝播前に交換する必要があり、トークン交換 トークングラントをサポートする Keycloak またはその他の OpenID Connect Provider を使用する場合は、AccessTokenRequestFilter
を次のように設定できます。
quarkus.oidc-client.auth-server-url=http://localhost:8180/auth/realms/quarkus quarkus.oidc-client.client-id=quarkus-app quarkus.oidc-client.credentials.secret=secret quarkus.oidc-client.grant.type=exchange quarkus.oidc-client.grant-options.exchange.audience=quarkus-app-exchange quarkus.oidc-token-propagation.exchange-token=true
現在のトークンを交換するために JWT ベアラートークングラント を 使用する必要がある Azure
などのプロバイダーを使用する場合は、次のように AccessTokenRequestFilter
を設定してトークンを交換できます。
quarkus.oidc-client.auth-server-url=${azure.provider.url} quarkus.oidc-client.client-id=quarkus-app quarkus.oidc-client.credentials.secret=secret quarkus.oidc-client.grant.type=jwt quarkus.oidc-client.grant-options.jwt.requested_token_use=on_behalf_of quarkus.oidc-client.scopes=https://graph.microsoft.com/user.read,offline_access quarkus.oidc-token-propagation.exchange-token=true
注記: AccessTokenRequestFilter
は OidcClient
を使用して現在のトークンを交換します。quarkus.oidc-client.grant-options.exchange
を使用して、OpenID Connect Provider が期待する追加の交換プロパティーを設定できます。
AccessTokenRequestFilter
はデフォルトの OidcClient
を使用します。名前付き OidcClient
は、quarkus.oidc-token-propagation.client-name
設定プロパティーを使用して選択できます。
7.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
を選択的に登録できます。次に例を示します。
import org.eclipse.microprofile.rest.client.inject.RegisterRestClient; import io.quarkus.oidc.token.propagation.JsonWebToken; @RegisterRestClient @JsonWebToken @Path("/") public interface ProtectedResourceService { @GET String getUserName(); }
あるいは、以下のような場合もあります。
import org.eclipse.microprofile.rest.client.annotation.RegisterProvider; import org.eclipse.microprofile.rest.client.inject.RegisterRestClient; import io.quarkus.oidc.token.propagation.JsonWebTokenRequestFilter; @RegisterRestClient @RegisterProvider(JsonWebTokenRequestFilter.class) @Path("/") public interface ProtectedResourceService { @GET String getUserName(); }
あるいは、quarkus.oidc-token-propagation.register-filter
プロパティーと quarkus.oidc-token-propagation.json-web-token
プロパティーの両方が true
に設定されている場合、JsonWebTokenRequestFilter
がすべての MicroProfile REST または Jakarta REST クライアントに自動的に登録できます。
7.4.2.1. 伝播前のトークンの更新
注入されたトークンの iss
(issuer) または aud
(audience) クレームを更新し、新しい署名で再度保護する必要がある場合は、次のように JsonWebTokenRequestFilter
を設定できます。
quarkus.oidc-token-propagation.secure-json-web-token=true smallrye.jwt.sign.key.location=/privateKey.pem # Set a new issuer smallrye.jwt.new-token.issuer=http://frontend-resource # Set a new audience smallrye.jwt.new-token.audience=http://downstream-resource # Override the existing token issuer and audience claims if they are already set smallrye.jwt.new-token.override-matching-claims=true
前述のように、Keycloak または Token Exchange プロトコルをサポートする OpenID Connect Provider を使用する場合は、AccessTokenRequestFilter
を使用します。
7.4.3. テスト
OpenID Connect ベアラートークン結合テスト セクションの説明に従って、トークンを生成できます。REST テストエンドポイントを準備します。登録されたトークン伝播フィルターを備えた朝中された MP REST クライアントを使用するテストフロントエンドエンドポイントで、ダウンストリームエンドポイントを呼び出すことができます。たとえば、main
Quarkus リポジトリーの integration-tests/oidc-token-propagation
を参照してください。