1.3. 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());
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;
@Blocking
@ConsumeEvent("product-order")
void processOrder(OrderResource.Product product) {
AccessTokenCredential tokenCredential = new AccessTokenCredential(product.customerAccessToken);
SecurityIdentity securityIdentity = identityProvider.authenticate(tokenCredential).await().indefinitely();
...
}
}
注意
在 HTTP 请求过程中使用供应商时,可以解析租户配置,如 使用 OpenID Connect Multi-Tenancy 指南中所述。但是,如果没有活跃的 HTTP 请求时,您必须使用 io.quarkus.oidc.Tenant qualifier 明确选择租户。
警告
目前不支持 动态租户配置解析。需要动态租户的身份验证将失败。