1.4. Quarkus REST 的令牌传播
quarkus-rest-client-oidc-token-propagation
扩展提供了一个 REST 客户端过滤器 io.quarkus.oidc.token.propagation.reactive.AccessTokenRequestReactiveFilter
,它简化了身份验证信息的传播。此客户端传播当前活动请求中存在的 bearer 令牌,或作为 HTTP Authorization
标头的 Bearer
方案值从 授权代码流机制 获取的令牌。
您可以使用 io.quarkus.oidc.token.propagation.common.AccessToken
或 org.eclipse.microprofile.rest.client.annotation.RegisterProvider
注解来选择性地注册 AccessTokenRequestReactiveFilter
,例如:
import org.eclipse.microprofile.rest.client.inject.RegisterRestClient; import io.quarkus.oidc.token.propagation.common.AccessToken; import jakarta.ws.rs.GET; import jakarta.ws.rs.Path; @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.reactive.AccessTokenRequestReactiveFilter; import jakarta.ws.rs.GET; import jakarta.ws.rs.Path; @RegisterRestClient @RegisterProvider(AccessTokenRequestReactiveFilter.class) @Path("/") public interface ProtectedResourceService { @GET String getUserName(); }
另外,AccessTokenRequestReactiveFilter
可以支持在传播令牌前交换令牌的复杂应用程序。
如果您使用 Keycloak 或其他支持 Token Exchange 令牌授权的 OIDC 供应商,您可以配置 AccessTokenRequestReactiveFilter
来交换令牌,如下所示:
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.resteasy-client-oidc-token-propagation.exchange-token=true 1
- 1
- 请注意,当 OidcClient 名称使用
io.quarkus.oidc.token.propagation.common.AccessToken"exchangeTokenClient 注解属性设置时,会忽略
配置属性。exchange
-token
AccessTokenRequestReactiveFilter
将使用 OidcClient
来交换当前令牌,您可以使用 quarkus.oidc-client.grant-options.exchange
设置 OpenID Connect 提供程序期望的额外交换属性。
如果您使用需要使用 JWT bearer 令牌 授权的 Azure
等提供程序来交换当前令牌,您可以配置 AccessTokenRequestReactiveFilter
来交换令牌,如下所示:
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.resteasy-client-oidc-token-propagation.exchange-token=true
AccessTokenRequestReactiveFilter
默认使用默认的 OidcClient
。可以使用 quarkus.rest-client-oidc-token-propagation.client-name
配置属性或 io.quarkus.oidc.token.propagation.common.AccessToken SerialexchangeTokenClient 注解属性来选择命名的
。
OidcClient