1.3. HTTP リクエストが完了した後の認証
場合によっては、アクティブな HTTP リクエストコンテキストが存在しない場合に、特定のトークンの SecurityIdentity を作成する必要があります。quarkus-oidc エクステンションは、トークンを SecurityIdentity インスタンスに変換するための io.quarkus.oidc.TenantIdentityProvider を提供します。たとえば、HTTP リクエストが完了した後にトークンを検証する必要がある状況の 1 つは、Vert.x イベントバス を使用してメッセージを処理している場合です。以下の例では、さまざまな 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());
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 マルチテナンシーの使用 ガイドで説明されているように、テナント設定を解決できます。ただし、アクティブな HTTP リクエストがない場合は、io.quarkus.oidc.Tenant 修飾子を使用してテナントを明示的に選択する必要があります。
動的テナント設定の解決 は現在サポートされていません。動的テナントを必要とする認証は失敗します。