1.2. HTTP 请求完成后进行身份验证


有时,如果没有活跃的 HTTP 请求上下文时,必须创建给定令牌的 SecurityIdentityquarkus-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
        ...
    }

}
1
对于默认租户,租户 限定符是可选的。
2
执行令牌验证,并将令牌转换为 SecurityIdentity
注意

在 HTTP 请求过程中使用供应商时,可以解析租户配置,如 使用 OpenID Connect Multi-Tenancy 指南中所述。但是,如果没有活跃的 HTTP 请求时,您必须使用 io.quarkus.oidc.Tenant qualifier 明确选择租户。

警告

目前不支持 动态租户配置解析。需要动态租户的身份验证将失败。

Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

© 2024 Red Hat, Inc.