1.2. HTTP 请求完成后进行身份验证
有时,如果没有活跃的 HTTP 请求上下文时,必须创建给定令牌的 SecurityIdentity
。quarkus-oidc
扩展提供 io.quarkus.oidc.TenantIdentityProvider
,将令牌转换为 SecurityIdentity
实例。例如,在 HTTP 请求完成后必须验证令牌时,其中一个情况是在您使用 Vert.x 事件总线 处理消息时。以下示例在不同的 CDI 请求上下文中使用"product-order"消息。因此,注入的 SecurityIdentity
无法正确代表验证的身份,并且是匿名的。
package org.acme.quickstart.oidc;
import static jakarta.ws.rs.core.HttpHeaders.AUTHORIZATION;
import jakarta.inject.Inject;
import jakarta.ws.rs.HeaderParam;
import jakarta.ws.rs.POST;
import jakarta.ws.rs.Path;
import io.vertx.core.eventbus.EventBus;
@Path("order")
public class OrderResource {
@Inject
EventBus eventBus;
@POST
public void order(String product, @HeaderParam(AUTHORIZATION) String bearer) {
String rawToken = bearer.substring("Bearer ".length()); 1
eventBus.publish("product-order", new Product(product, rawToken));
}
public static class Product {
public String product;
public String customerAccessToken;
public Product() {
}
public Product(String product, String customerAccessToken) {
this.product = product;
this.customerAccessToken = customerAccessToken;
}
}
}
- 1
- 此时,在禁用主动身份验证时,不会验证令牌。
package org.acme.quickstart.oidc; import jakarta.enterprise.context.ApplicationScoped; import jakarta.inject.Inject; import io.quarkus.oidc.AccessTokenCredential; import io.quarkus.oidc.Tenant; import io.quarkus.oidc.TenantIdentityProvider; import io.quarkus.security.identity.SecurityIdentity; import io.quarkus.vertx.ConsumeEvent; import io.smallrye.common.annotation.Blocking; @ApplicationScoped public class OrderService { @Tenant("tenantId") @Inject TenantIdentityProvider identityProvider; @Inject TenantIdentityProvider defaultIdentityProvider; 1 @Blocking @ConsumeEvent("product-order") void processOrder(OrderResource.Product product) { AccessTokenCredential tokenCredential = new AccessTokenCredential(product.customerAccessToken); SecurityIdentity securityIdentity = identityProvider.authenticate(tokenCredential).await().indefinitely(); 2 ... } }
注意
在 HTTP 请求过程中使用供应商时,可以解析租户配置,如 使用 OpenID Connect Multi-Tenancy 指南中所述。但是,如果没有活跃的 HTTP 请求时,您必须使用 io.quarkus.oidc.Tenant
qualifier 明确选择租户。
警告
目前不支持 动态租户配置解析。需要动态租户的身份验证将失败。