1.2. HTTP リクエストが完了した後の認証
場合によっては、アクティブな HTTP リクエストコンテキストが存在しない場合に、特定のトークンの SecurityIdentity
を作成する必要があります。quarkus-oidc
エクステンションは、トークンを SecurityIdentity
インスタンスに変換するための io.quarkus.oidc.TenantIdentityProvider
を提供します。たとえば、HTTP リクエストが完了した後にトークンを検証する必要がある状況の 1 つは、Vert.x event bus を使用してメッセージを処理している場合です。以下の例では、さまざまな CDI リクエストコンテキスト内で 'product-order' メッセージを使用しています。したがって、注入された SecurityIdentity
は検証された ID を正しく表さず、匿名になります。
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.TenantFeature; 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 { @TenantFeature("tenantId") @Inject TenantIdentityProvider identityProvider; @Inject TenantIdentityProvider defaultIdentityProvider; 1 @Blocking @ConsumeEvent("product-order") void processOrder(Product product) { AccessTokenCredential tokenCredential = new AccessTokenCredential(product.customerAccessToken); SecurityIdentity securityIdentity = identityProvider.authenticate(tokenCredential).await().indefinitely(); 2 ... } }
HTTP リクエスト中にプロバイダーが使用される場合、OpenID Connect マルチテナンシーの使用 ガイドで説明されているように、テナント設定を解決できます。ただし、アクティブな HTTP リクエストがない場合は、io.quarkus.oidc.TenantFeature
修飾子を使用してテナントを明示的に選択する必要があります。
動的テナント設定の解決 は現在サポートされていません。動的テナントを必要とする認証は失敗します。