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
        ...
    }

}
1
デフォルトのテナントの場合、TenantFeature 修飾子はオプションです。
2
トークンの検証を実行し、トークンを SecurityIdentity に変換します。
注記

HTTP リクエスト中にプロバイダーが使用される場合、OpenID Connect マルチテナンシーの使用 ガイドで説明されているように、テナント設定を解決できます。ただし、アクティブな HTTP リクエストがない場合は、io.quarkus.oidc.TenantFeature 修飾子を使用してテナントを明示的に選択する必要があります。

警告

動的テナント設定の解決 は現在サポートされていません。動的テナントを必要とする認証は失敗します。

Red Hat logoGithubRedditYoutubeTwitter

詳細情報

試用、購入および販売

コミュニティー

Red Hat ドキュメントについて

Red Hat をお使いのお客様が、信頼できるコンテンツが含まれている製品やサービスを活用することで、イノベーションを行い、目標を達成できるようにします。

多様性を受け入れるオープンソースの強化

Red Hat では、コード、ドキュメント、Web プロパティーにおける配慮に欠ける用語の置き換えに取り組んでいます。このような変更は、段階的に実施される予定です。詳細情報: Red Hat ブログ.

会社概要

Red Hat は、企業がコアとなるデータセンターからネットワークエッジに至るまで、各種プラットフォームや環境全体で作業を簡素化できるように、強化されたソリューションを提供しています。

© 2024 Red Hat, Inc.