OpenID Connect (OIDC) クライアントとトークンの伝播


Red Hat build of Quarkus 3.20

Red Hat Customer Content Services

概要

このガイドでは、トークン管理、リクエストのフィルタリング、アプリケーションのセットアップなど、OpenID Connect (OIDC) クライアントとトークンの伝播を設定および使用する方法を詳しく説明します。

Red Hat build of Quarkus ドキュメントへのフィードバックの提供

エラーを報告したり、ドキュメントを改善したりするには、Red Hat Jira アカウントにログインし、課題を送信してください。Red Hat Jira アカウントをお持ちでない場合は、アカウントを作成するように求められます。

手順

  1. 次のリンクをクリックして チケットを作成します
  2. Summary に課題の簡単な説明を入力します。
  3. Description に課題や機能拡張の詳細な説明を入力します。問題があるドキュメントのセクションへの URL も記載してください。
  4. Submit をクリックすると、課題が作成され、適切なドキュメントチームに転送されます。

第1章 OpenID Connect (OIDC) と OAuth2 クライアントおよびフィルター

Quarkus エクステンションは、トークンの取得、更新、伝播に重点を置いて、OpenID Connect および OAuth 2.0 アクセストークンの管理に使用できます。

これには、以下のパラメーターが含まれます。

  • quarkus-oidc-clientquarkus-rest-client-oidc-filter、および quarkus-resteasy-client-oidc-filter エクステンション。OpenID Connect および Keycloak などの OAuth 2.0 準拠の認可サーバーからアクセストークンを取得および更新するために使用します。
  • quarkus-rest-client-oidc-token-propagation および quarkus-resteasy-client-oidc-token-propagation エクステンション。現在の Bearer または Authorization Code Flow アクセストークンを伝播するために使用します。

これらのエクステンションによって管理されるアクセストークンは、リモートサービスにアクセスするための HTTP 認可ベアラートークンとして使用できます。

OpenID Connect クライアントとトークンの伝播クイックスタート も参照してください。

1.1. OidcClient

次の依存関係を追加します。

<dependency>
    <groupId>io.quarkus</groupId>
    <artifactId>quarkus-oidc-client</artifactId>
</dependency>
Copy to Clipboard Toggle word wrap

quarkus-oidc-client エクステンションは、SmallRye Mutiny Uni および Vert.x WebClient を使用してトークンを取得および更新するのに使用できるリアクティブ io.quarkus.oidc.client.OidcClient を提供します。

OidcClient はビルド時に IDP トークンエンドポイント URL を使用して初期化されます。これは自動検出または手動で設定できます。OidcClient はこのエンドポイントを使用して、client_credentialspassword などのトークングラントを使用してアクセストークンを取得し、refresh_token グラントを使用してトークンを更新します。

1.1.1. トークンエンドポイントの設定

デフォルトでは、トークンエンドポイントアドレスは、設定された quarkus.oidc-client.auth-server-url/.well-known/openid-configuration パスを追加することによって検出されます。

たとえば、次の Keycloak URL があるとします。

quarkus.oidc-client.auth-server-url=http://localhost:8180/auth/realms/quarkus
Copy to Clipboard Toggle word wrap

OidcClient は、トークンエンドポイント URL が http://localhost:8180/auth/realms/quarkus/protocol/openid-connect/tokens であることを検出します。

また、検出エンドポイントが使用できない場合、または検出エンドポイントのラウンドトリップを節約したい場合は、検出を無効にして、相対パス値を使用してトークンエンドポイントアドレスを設定できます。以下に例を示します。

quarkus.oidc-client.auth-server-url=http://localhost:8180/auth/realms/quarkus
quarkus.oidc-client.discovery-enabled=false
# Token endpoint: http://localhost:8180/auth/realms/quarkus/protocol/openid-connect/tokens
quarkus.oidc-client.token-path=/protocol/openid-connect/tokens
Copy to Clipboard Toggle word wrap

検出なしでトークンエンドポイント URL を設定するよりコンパクトな方法は、quarkus.oidc-client.token-path を絶対 URL に設定することです。

quarkus.oidc-client.token-path=http://localhost:8180/auth/realms/quarkus/protocol/openid-connect/tokens
Copy to Clipboard Toggle word wrap

この場合、quarkus.oidc-client.auth-server-urlquarkus.oidc-client.discovery-enabled を設定する必要はありません。

1.1.2. サポートされているトークングラント

OidcClient がトークンを取得するために使用できる主なトークングラントは、client_credentials グラント (デフォルト) と password グラントです。

1.1.2.1. クライアントクレデンシャルのグラント

OidcClientclient_credentials グラントを使用するように設定する方法は次のとおりです。

quarkus.oidc-client.auth-server-url=http://localhost:8180/auth/realms/quarkus/
quarkus.oidc-client.client-id=quarkus-app
quarkus.oidc-client.credentials.secret=secret
Copy to Clipboard Toggle word wrap

client_credentials グラントにより、quarkus.oidc-client.grant-options.client.<param-name>=<value> を使用してトークンリクエストの追加パラメーターを設定できます。audience パラメーターを使用して、対象のトークンの受信者を設定する方法は次のとおりです。

quarkus.oidc-client.auth-server-url=http://localhost:8180/auth/realms/quarkus/
quarkus.oidc-client.client-id=quarkus-app
quarkus.oidc-client.credentials.secret=secret
# 'client' is a shortcut for `client_credentials`
quarkus.oidc-client.grant.type=client
quarkus.oidc-client.grant-options.client.audience=https://example.com/api
Copy to Clipboard Toggle word wrap
1.1.2.2. パスワードグラント

password グラントを使用するように OidcClient を設定する方法は次のとおりです。

quarkus.oidc-client.auth-server-url=http://localhost:8180/auth/realms/quarkus/
quarkus.oidc-client.client-id=quarkus-app
quarkus.oidc-client.credentials.secret=secret
quarkus.oidc-client.grant.type=password
quarkus.oidc-client.grant-options.password.username=alice
quarkus.oidc-client.grant-options.password.password=alice
Copy to Clipboard Toggle word wrap

クライアントクレデンシャルのグラントをカスタマイズする方法と同様に、quarkus.oidc-client.grant-options.password 設定接頭辞を使用してさらにカスタマイズできます。

1.1.2.3. その他のグラント

OidcClient は、設定でキャプチャーできない追加の入力パラメーターを必要とする許可を使用してトークンを取得するのにも役立ちます。これらの許可は、refresh_token (外部更新トークンを使用)、authorization_code、および現在のアクセストークンを交換するために使用できる 2 つの許可、つまり urn:ietf:params:oauth:grant-type:token-exchange および urn:ietf:params:oauth:grant-type:jwt-bearer です。

アクセストークンを取得する必要があり、既存のリフレッシュトークンを現在の Quarkus エンドポイントにすでに送信した場合は、refresh_token グラントを使用する必要があります。このグラントでは、新しいトークンセットを取得するために、帯域外のリフレッシュトークンを使用します。この場合は、OidcClient を次のように設定します。

quarkus.oidc-client.auth-server-url=http://localhost:8180/auth/realms/quarkus/
quarkus.oidc-client.client-id=quarkus-app
quarkus.oidc-client.credentials.secret=secret
quarkus.oidc-client.grant.type=refresh
Copy to Clipboard Toggle word wrap

次に、提供された更新トークンを使用して OidcClient.refreshTokens メソッドを使用してアクセストークンを取得できます。

複雑なマイクロサービスアプリケーションを構築していて、同じ Bearer トークンが複数のサービスに伝播されて使用されるのを避ける必要がある場合、urn:ietf:params:oauth:grant-type:token-exchange または urn:ietf:params:oauth:grant-type:jwt-bearer グラントの使用が必要になることがあります。詳細は、Quarkus REST のトークン伝播 および RESTEasy Classic のトークン伝播 を参照してください。

何らかの理由で、Quarkus OIDC エクステンション を使用して認可コードフローをサポートできない場合は、OidcClient を使用した authorization code グラントのサポートが必要になる場合があります。認可コードフローを実装する十分な理由がある場合は、次のように OidcClient を設定できます。

quarkus.oidc-client.auth-server-url=http://localhost:8180/auth/realms/quarkus/
quarkus.oidc-client.client-id=quarkus-app
quarkus.oidc-client.credentials.secret=secret
quarkus.oidc-client.grant.type=code
Copy to Clipboard Toggle word wrap

次に、OidcClient.accessTokens メソッドを使用して、追加プロパティーのマップを受け入れ、現在の coderedirect_uri パラメーターを渡して、トークンの認可コードを交換できます。

OidcClient は、urn:openid:params:grant-type:ciba グラントもサポートします。

quarkus.oidc-client.auth-server-url=http://localhost:8180/auth/realms/quarkus/
quarkus.oidc-client.client-id=quarkus-app
quarkus.oidc-client.credentials.secret=secret
quarkus.oidc-client.grant.type=ciba
Copy to Clipboard Toggle word wrap

次に、OidcClient.accessTokens メソッドを使用して追加プロパティーのマップを受け入れ、auth_req_id パラメーターを渡してトークン認可コードを交換できます。

1.1.2.4. スコープの付与

発行されたアクセストークンに特定のスコープのセットを関連付けるように要求しないといけない場合があります。専用の quarkus.oidc-client.scopes リストプロパティーを使用します (例: quarkus.oidc-client.scopes=email,phone)。

1.1.3. OidcClient の直接使用

OidcClient を直接使用してアクセストークンを取得し、それを Bearer スキーム値として HTTP Authorization ヘッダーに設定できます。

たとえば、ユーザー名を返すマイクロサービスに Quarkus エンドポイントがアクセスする必要があるとします。まず、REST クライアントを作成します。

package org.acme.security.openid.connect.client;

import org.eclipse.microprofile.rest.client.inject.RegisterRestClient;

import io.smallrye.mutiny.Uni;
import jakarta.ws.rs.GET;
import jakarta.ws.rs.HeaderParam;
import jakarta.ws.rs.Path;
import jakarta.ws.rs.Produces;

@RegisterRestClient
@Path("/")
public interface RestClientWithTokenHeaderParam {

    @GET
    @Produces("text/plain")
    @Path("userName")
    Uni<String> getUserName(@HeaderParam("Authorization") String authorization);
}
Copy to Clipboard Toggle word wrap

次に、OidcClient を使用してトークンを取得し、伝播します。

package org.acme.security.openid.connect.client;

import org.eclipse.microprofile.rest.client.inject.RestClient;

import io.quarkus.oidc.client.runtime.TokensHelper;
import io.quarkus.oidc.client.OidcClient;

import io.smallrye.mutiny.Uni;
import jakarta.inject.Inject;
import jakarta.ws.rs.GET;
import jakarta.ws.rs.Path;
import jakarta.ws.rs.Produces;

@Path("/service")
public class OidcClientResource {

    @Inject
    OidcClient client;
    TokensHelper tokenHelper = new TokensHelper(); 
1


    @Inject
    @RestClient
    RestClientWithTokenHeaderParam restClient;

    @GET
    @Path("user-name")
    @Produces("text/plain")
    public Uni<String> getUserName() {
    	return tokenHelper.getTokens(client).onItem()
        		.transformToUni(tokens -> restClient.getUserName("Bearer " + tokens.getAccessToken()));
    }
}
Copy to Clipboard Toggle word wrap
1
io.quarkus.oidc.client.runtime.TokensHelper は、アクセストークンの取得と更新を管理します。

1.1.4. トークンの注入

OidcClient を内部的に使用する Tokens を注入できます。Tokens を使用してアクセストークンを取得し、必要に応じて更新することができます。

import jakarta.inject.Inject;
import jakarta.ws.rs.GET;
import jakarta.ws.rs.Path;

import io.quarkus.oidc.client.Tokens;

@Path("/service")
public class OidcClientResource {

    @Inject Tokens tokens;

    @GET
    public String getResponse() {
        //  Get the access token, which might have been refreshed.
        String accessToken = tokens.getAccessToken();
        // Use the access token to configure MP RestClient Authorization header/etc
    }
}
Copy to Clipboard Toggle word wrap

1.1.5. OidcClients の使用

io.quarkus.oidc.client.OidcClientsOidcClient のコンテナーです。デフォルトの OidcClient と、次のように設定できる名前付きクライアントが含まれています。

quarkus.oidc-client.client-enabled=false

quarkus.oidc-client.jwt-secret.auth-server-url=http://localhost:8180/auth/realms/quarkus/
quarkus.oidc-client.jwt-secret.client-id=quarkus-app
quarkus.oidc-client.jwt-secret.credentials.jwt.secret=AyM1SysPpbyDfgZld3umj1qzKObwVMkoqQ-EstJQLr_T-1qS0gZH75aKtMN3Yj0iPS4hcgUuTwjAzZr1Z9CAow
Copy to Clipboard Toggle word wrap

この場合、デフォルトのクライアントは client-enabled=false プロパティーによって無効になります。jwt-secret クライアントには次のようにアクセスできます。

import org.eclipse.microprofile.rest.client.inject.RestClient;

import jakarta.inject.Inject;
import jakarta.ws.rs.GET;
import jakarta.ws.rs.Path;
import jakarta.ws.rs.Produces;
import io.smallrye.mutiny.Uni;
import io.quarkus.oidc.client.OidcClient;
import io.quarkus.oidc.client.OidcClients;
import io.quarkus.oidc.client.runtime.TokensHelper;

@Path("/clients")
public class OidcClientResource {

    @Inject
    OidcClients clients;
    TokensHelper tokenHelper = new TokensHelper();

    @Inject
    @RestClient
    RestClientWithTokenHeaderParam restClient; 
1


    @GET
    @Path("user-name")
    @Produces("text/plain")
    public Uni<String> getUserName() {
    	OidcClient client = clients.getClient("jwt-secret");
    	return tokenHelper.getTokens(client).onItem()
        		.transformToUni(tokens -> restClient.getUserName("Bearer " + tokens.getAccessToken()));
    }
}
Copy to Clipboard Toggle word wrap
1
OidcClient の直接使用 セクションの RestClientWithTokenHeaderParam 宣言を参照してください。
注記

OIDC マルチテナンシー も使用しており、各 OIDC テナントに独自の OidcClient が関連付けられている場合は、Vert.x RoutingContext tenant-id 属性を使用できます。以下に例を示します。

import jakarta.inject.Inject;
import jakarta.ws.rs.GET;
import jakarta.ws.rs.Path;

import io.quarkus.oidc.client.OidcClient;
import io.quarkus.oidc.client.OidcClients;
import io.vertx.ext.web.RoutingContext;

@Path("/clients")
public class OidcClientResource {

    @Inject
    OidcClients clients;
    @Inject
    RoutingContext context;

    @GET
    public String getResponse() {
        String tenantId = context.get("tenant-id");
        // named OIDC tenant and client configurations use the same key:
        OidcClient client = clients.getClient(tenantId);
        //Use this client to get the token
    }
}
Copy to Clipboard Toggle word wrap

プログラムで新しい OidcClient を作成することもできます。たとえば、起動時に OidcClient を作成する必要があるとします。

package org.acme.security.openid.connect.client;

import java.util.Map;

import org.eclipse.microprofile.config.inject.ConfigProperty;

import io.quarkus.oidc.client.OidcClient;
import io.quarkus.oidc.client.runtime.OidcClientConfig;
import io.quarkus.oidc.client.runtime.OidcClientConfig.Grant.Type;
import io.quarkus.oidc.client.OidcClients;
import io.quarkus.runtime.StartupEvent;
import io.smallrye.mutiny.Uni;
import jakarta.enterprise.context.ApplicationScoped;
import jakarta.enterprise.event.Observes;
import jakarta.inject.Inject;

@ApplicationScoped
public class OidcClientCreator {

    @Inject
    OidcClients oidcClients;
    @ConfigProperty(name = "quarkus.oidc.auth-server-url")
    String oidcProviderAddress;

    private volatile OidcClient oidcClient;

    public void startup(@Observes StartupEvent event) {
    	createOidcClient().subscribe().with(client -> {oidcClient = client;});
    }

    public OidcClient getOidcClient() {
        return oidcClient;
    }

    private Uni<OidcClient> createOidcClient() {
        OidcClientConfig cfg = OidcClientConfig
            .authServerUrl(oidcProviderAddress)
            .id("myclient")
            .clientId("backend-service")
            .credentials("secret")
            .grant(Type.PASSWORD)
            .grantOptions("password", Map.of("username", "alice", "password", "alice"))
            .build();
        return oidcClients.newClient(cfg);
    }
}
Copy to Clipboard Toggle word wrap

このクライアントは次のように使用できます。

import org.eclipse.microprofile.rest.client.inject.RestClient;

import jakarta.inject.Inject;
import jakarta.ws.rs.GET;
import jakarta.ws.rs.Path;
import jakarta.ws.rs.Produces;
import io.smallrye.mutiny.Uni;
import io.quarkus.oidc.client.runtime.TokensHelper;

@Path("/clients")
public class OidcClientResource {

    @Inject
    OidcClientCreator oidcClientCreator;
    TokensHelper tokenHelper = new TokensHelper();

    @Inject
    @RestClient
    RestClientWithTokenHeaderParam restClient; 
1


    @GET
    @Path("user-name")
    @Produces("text/plain")
    public Uni<String> getUserName() {
    	return tokenHelper.getTokens(oidcClientCreator.getOidcClient()).onItem()
        		.transformToUni(tokens -> restClient.getUserName("Bearer " + tokens.getAccessToken()));
    }
}
Copy to Clipboard Toggle word wrap
1
OidcClient の直接使用 セクションの RestClientWithTokenHeaderParam 宣言を参照してください。

1.1.6. 名前付きの OidcClient とトークンの注入

複数の OidcClient オブジェクトが設定されている場合は、OidcClients を使用する代わりに、追加の修飾子 @NamedOidcClient によって OidcClient 注入ターゲットを指定できます。

package org.acme.security.openid.connect.client;

import org.eclipse.microprofile.rest.client.inject.RestClient;
import jakarta.inject.Inject;
import jakarta.ws.rs.GET;
import jakarta.ws.rs.Path;
import jakarta.ws.rs.Produces;
import io.smallrye.mutiny.Uni;
import io.quarkus.oidc.client.NamedOidcClient;
import io.quarkus.oidc.client.OidcClient;
import io.quarkus.oidc.client.runtime.TokensHelper;

@Path("/clients")
public class OidcClientResource {

    @Inject
    @NamedOidcClient("jwt-secret")
    OidcClient client;

    TokensHelper tokenHelper = new TokensHelper();

    @Inject
    @RestClient
    RestClientWithTokenHeaderParam restClient; 
1


    @GET
    @Path("user-name")
    @Produces("text/plain")
    public Uni<String> getUserName() {
    	return tokenHelper.getTokens(client).onItem()
        		.transformToUni(tokens -> restClient.getUserName("Bearer " + tokens.getAccessToken()));
    }
}
Copy to Clipboard Toggle word wrap
1
OidcClient の直接使用 セクションの RestClientWithTokenHeaderParam 宣言を参照してください。

同じ修飾子を使用して、Tokens の注入に使用される OidcClient を指定できます。

import java.io.IOException;

import jakarta.annotation.Priority;
import jakarta.enterprise.context.RequestScoped;
import jakarta.inject.Inject;
import jakarta.ws.rs.Priorities;
import jakarta.ws.rs.client.ClientRequestContext;
import jakarta.ws.rs.client.ClientRequestFilter;
import jakarta.ws.rs.core.HttpHeaders;
import jakarta.ws.rs.ext.Provider;

import io.quarkus.oidc.client.NamedOidcClient;
import io.quarkus.oidc.client.Tokens;

@Provider
@Priority(Priorities.AUTHENTICATION)
@RequestScoped
public class OidcClientRequestCustomFilter implements ClientRequestFilter {

    @Inject
    @NamedOidcClient("jwt-secret")
    Tokens tokens;

    @Override
    public void filter(ClientRequestContext requestContext) throws IOException {
        requestContext.getHeaders().add(HttpHeaders.AUTHORIZATION, "Bearer " + tokens.getAccessToken());
    }
}
Copy to Clipboard Toggle word wrap

1.1.7. RestClient Reactive ClientFilter での OidcClient の使用

以下の Maven 依存関係を追加します。

<dependency>
    <groupId>io.quarkus</groupId>
    <artifactId>quarkus-rest-client-oidc-filter</artifactId>
</dependency>
Copy to Clipboard Toggle word wrap
注記

io.quarkus:quarkus-oidc-client も追加されます。

quarkus-rest-client-oidc-filter エクステンションは、io.quarkus.oidc.client.filter.OidcClientRequestReactiveFilter を提供します。

これは、OidcClientRequestFilter と同様に機能します (MicroProfile RestClient クライアントフィルターでの OidcClient の使用 を参照)。つまり、OidcClient を使用してアクセストークンを取得し、必要に応じて更新し、HTTP Authorization Bearer スキーム値として設定します。違いは、Reactive RestClient と連携し、トークンを取得または更新するときに現在の IO スレッドをブロックしない非ブロッキングクライアントフィルターを実装することです。

OidcClientRequestReactiveFilter は、IO スレッドのブロックを回避するために、最初のトークンの取得が実行されるまで遅延します。

io.quarkus.oidc.client.reactive.filter.OidcClientFilter または org.eclipse.microprofile.rest.client.annotation.RegisterProvider アノテーションを使用して、OidcClientRequestReactiveFilter を選択的に登録できます。

import org.eclipse.microprofile.rest.client.inject.RegisterRestClient;
import io.quarkus.oidc.client.filter.OidcClientFilter;
import io.smallrye.mutiny.Uni;
import jakarta.ws.rs.GET;
import jakarta.ws.rs.Path;

@RegisterRestClient
@OidcClientFilter
@Path("/")
public interface ProtectedResourceService {

    @GET
    Uni<String> getUserName();
}
Copy to Clipboard Toggle word wrap

または

import org.eclipse.microprofile.rest.client.annotation.RegisterProvider;
import org.eclipse.microprofile.rest.client.inject.RegisterRestClient;
import io.quarkus.oidc.client.reactive.filter.OidcClientRequestReactiveFilter;
import io.smallrye.mutiny.Uni;
import jakarta.ws.rs.GET;
import jakarta.ws.rs.Path;

@RegisterRestClient
@RegisterProvider(OidcClientRequestReactiveFilter.class)
@Path("/")
public interface ProtectedResourceService {

    @GET
    Uni<String> getUserName();
}
Copy to Clipboard Toggle word wrap

OidcClientRequestReactiveFilter はデフォルトの OidcClient を使用します。名前付きの OidcClient は、quarkus.rest-client-oidc-filter.client-name 設定プロパティーを使用して選択できます。@OidcClientFilter アノテーションの value 属性を設定して、OidcClient を選択することもできます。アノテーションを通じて設定されたクライアント名は、quarkus.rest-client-oidc-filter.client-name 設定プロパティーよりも優先されます。たとえば、OIDC クライアント宣言という名前の こちらjwt-secret がある場合、このクライアントを次のように参照できます。

import org.eclipse.microprofile.rest.client.inject.RegisterRestClient;
import io.quarkus.oidc.client.filter.OidcClientFilter;
import io.smallrye.mutiny.Uni;
import jakarta.ws.rs.GET;
import jakarta.ws.rs.Path;

@RegisterRestClient
@OidcClientFilter("jwt-secret")
@Path("/")
public interface ProtectedResourceService {

    @GET
    Uni<String> getUserName();
}
Copy to Clipboard Toggle word wrap

1.1.8. RestClient ClientFilter での OidcClient の使用

以下の Maven 依存関係を追加します。

<dependency>
    <groupId>io.quarkus</groupId>
    <artifactId>quarkus-resteasy-client-oidc-filter</artifactId>
</dependency>
Copy to Clipboard Toggle word wrap
注記

io.quarkus:quarkus-oidc-client も追加されます。

quarkus-resteasy-client-oidc-filter エクステンションは、io.quarkus.oidc.client.filter.OidcClientRequestFilter Jakarta REST ClientRequestFilter を提供します。これは、OidcClient を使用してアクセストークンを取得し、必要に応じて更新し、HTTP Authorization Bearer スキーム値として設定します。

デフォルトでは、このフィルターは、初期化時に OidcClient がアクセストークンと更新トークンの最初のペアを取得するようにします。アクセストークンの有効期間が短く、更新トークンが利用できない場合は、quarkus.oidc-client.early-tokens-acquisition=false を使用してトークンの取得を遅らせる必要があります。

io.quarkus.oidc.client.filter.OidcClientFilter または org.eclipse.microprofile.rest.client.annotation.RegisterProvider のいずれかのアノテーションを使用して、OidcClientRequestFilter を選択的に登録できます。

import org.eclipse.microprofile.rest.client.inject.RegisterRestClient;
import io.quarkus.oidc.client.filter.OidcClientFilter;
import jakarta.ws.rs.GET;
import jakarta.ws.rs.Path;

@RegisterRestClient
@OidcClientFilter
@Path("/")
public interface ProtectedResourceService {

    @GET
    String getUserName();
}
Copy to Clipboard Toggle word wrap

または

import org.eclipse.microprofile.rest.client.annotation.RegisterProvider;
import org.eclipse.microprofile.rest.client.inject.RegisterRestClient;
import io.quarkus.oidc.client.filter.OidcClientRequestFilter;
import jakarta.ws.rs.GET;
import jakarta.ws.rs.Path;

@RegisterRestClient
@RegisterProvider(OidcClientRequestFilter.class)
@Path("/")
public interface ProtectedResourceService {

    @GET
    String getUserName();
}
Copy to Clipboard Toggle word wrap

または、quarkus.resteasy-client-oidc-filter.register-filter=true プロパティーが設定されている場合、OidcClientRequestFilter はすべての MP Rest または Jakarta REST クライアントに自動的に登録できます。

OidcClientRequestFilter はデフォルトの OidcClient を使用します。名前付きの OidcClient は、quarkus.resteasy-client-oidc-filter.client-name 設定プロパティーを使用して選択できます。@OidcClientFilter アノテーションの value 属性を設定して、OidcClient を選択することもできます。アノテーションを通じて設定されたクライアント名は、quarkus.resteasy-client-oidc-filter.client-name 設定プロパティーよりも優先されます。たとえば、OIDC クライアント宣言という名前の こちらjwt-secret がある場合、このクライアントを次のように参照できます。

import org.eclipse.microprofile.rest.client.inject.RegisterRestClient;
import io.quarkus.oidc.client.filter.OidcClientFilter;
import jakarta.ws.rs.GET;
import jakarta.ws.rs.Path;

@RegisterRestClient
@OidcClientFilter("jwt-secret")
@Path("/")
public interface ProtectedResourceService {

    @GET
    String getUserName();
}
Copy to Clipboard Toggle word wrap

1.1.9. カスタム RestClient ClientFilter を使用する

必要に応じて、独自のカスタムフィルターを使用して Tokens を注入することもできます。

import java.io.IOException;
import jakarta.annotation.Priority;
import jakarta.inject.Inject;
import jakarta.ws.rs.Priorities;
import jakarta.ws.rs.client.ClientRequestContext;
import jakarta.ws.rs.client.ClientRequestFilter;
import jakarta.ws.rs.core.HttpHeaders;
import jakarta.ws.rs.ext.Provider;
import io.quarkus.oidc.client.Tokens;

@Provider
@Priority(Priorities.AUTHENTICATION)
public class OidcClientRequestCustomFilter implements ClientRequestFilter {

    @Inject
    Tokens tokens;

    @Override
    public void filter(ClientRequestContext requestContext) throws IOException {
        requestContext.getHeaders().add(HttpHeaders.AUTHORIZATION, "Bearer " + tokens.getAccessToken());
    }
}
Copy to Clipboard Toggle word wrap

Tokens プロデューサーはトークンを取得して更新し、カスタムフィルターはトークンの使用方法とタイミングを決定します。

名前付きの Tokens を注入することもできます。名前付きの OidcClient とトークンの注入 を参照してください。

1.1.10. アクセストークンの更新

OidcClientRequestReactiveFilterOidcClientRequestFilter、および Tokens プロデューサーは、更新トークンが利用可能な場合、現在の期限切れのアクセストークンを更新します。さらに、quarkus.oidc-client.refresh-token-time-skew プロパティーを使用して、アクセストークンをプリエンプティブに更新し、HTTP 401 エラーの原因となる可能性のある期限切れに近いアクセストークンの送信を回避することもできます。たとえば、このプロパティーが 3S に設定され、アクセストークンの有効期限が 3 秒未満の場合、このトークンは自動的に更新されます。

アクセストークンを更新する必要があるが、更新トークンが利用できない場合は、client_credentials などの設定された許可を使用して新しいトークンを取得しようとします。

一部の OpenID Connect プロバイダーは、client_credentials グラントのレスポンスでリフレッシュトークンを返しません。たとえば、Keycloak 12 以降では、client_credentials に対して更新トークンがデフォルトで返されなくなります。プロバイダーは、更新トークンの使用回数を制限する場合もあります。

1.1.11. アクセストークンの取り消し

Keycloak などの OpenId Connect プロバイダーがトークン失効エンドポイントをサポートしている場合は、OidcClient#revokeAccessToken を使用して現在のアクセストークンを取り消すことができます。失効エンドポイント URL は、トークン要求 URI と一緒に検出されるか、quarkus.oidc-client.revoke-path を使用して設定できます。

このトークンを REST クライアントで使用すると HTTP 401 ステータスコードで失敗した場合、またはアクセストークンがすでに長期間使用されていて更新したい場合は、アクセストークンの取り消しが必要になる場合があります。

これは、更新トークンを使用して、トークンの更新をリクエストすることによって実現できます。ただし、更新トークンが利用できない場合は、まず更新トークンを取り消してから新しいアクセストークンを要求することで更新できます。

1.1.12. OidcClient 認証

OidcClient は、client_credentials およびその他の許可要求が成功するために、OpenID Connect Provider に対して認証する必要があります。すべての OIDC クライアント認証 オプションがサポートされています。以下に例を示します。

client_secret_basic:

quarkus.oidc-client.auth-server-url=http://localhost:8180/auth/realms/quarkus/
quarkus.oidc-client.client-id=quarkus-app
quarkus.oidc-client.credentials.secret=mysecret
Copy to Clipboard Toggle word wrap

または

quarkus.oidc-client.auth-server-url=http://localhost:8180/auth/realms/quarkus/
quarkus.oidc-client.client-id=quarkus-app
quarkus.oidc-client.credentials.client-secret.value=mysecret
Copy to Clipboard Toggle word wrap

または、CredentialsProvider から取得したシークレットを使用します。

quarkus.oidc-client.auth-server-url=http://localhost:8180/auth/realms/quarkus/
quarkus.oidc-client.client-id=quarkus-app

# This key is used to retrieve a secret from the map of credentials returned from CredentialsProvider
quarkus.oidc-client.credentials.client-secret.provider.key=mysecret-key
# This is the keyring provided to the CredentialsProvider when looking up the secret, set only if required by the CredentialsProvider implementation
quarkus.oidc.credentials.client-secret.provider.keyring-name=oidc
# Set it only if more than one CredentialsProvider can be registered
quarkus.oidc-client.credentials.client-secret.provider.name=oidc-credentials-provider
Copy to Clipboard Toggle word wrap

client_secret_post:

quarkus.oidc-client.auth-server-url=http://localhost:8180/auth/realms/quarkus/
quarkus.oidc-client.client-id=quarkus-app
quarkus.oidc-client.credentials.client-secret.value=mysecret
quarkus.oidc-client.credentials.client-secret.method=post
Copy to Clipboard Toggle word wrap

client_secret_jwt: 署名アルゴリズムは HS256 です。

quarkus.oidc-client.auth-server-url=http://localhost:8180/auth/realms/quarkus/
quarkus.oidc-client.client-id=quarkus-app
quarkus.oidc-client.credentials.jwt.secret=AyM1SysPpbyDfgZld3umj1qzKObwVMkoqQ-EstJQLr_T-1qS0gZH75aKtMN3Yj0iPS4hcgUuTwjAzZr1Z9CAow
Copy to Clipboard Toggle word wrap

または、CredentialsProvider から取得したシークレットの場合、署名アルゴリズムは HS256 です。

quarkus.oidc-client.auth-server-url=http://localhost:8180/auth/realms/quarkus/
quarkus.oidc-client.client-id=quarkus-app

# This is a key that will be used to retrieve a secret from the map of credentials returned from CredentialsProvider
quarkus.oidc-client.credentials.jwt.secret-provider.key=mysecret-key
# This is the keyring provided to the CredentialsProvider when looking up the secret, set only if required by the CredentialsProvider implementation
quarkus.oidc.credentials.client-secret.provider.keyring-name=oidc
# Set it only if more than one CredentialsProvider can be registered
quarkus.oidc-client.credentials.jwt.secret-provider.name=oidc-credentials-provider
Copy to Clipboard Toggle word wrap

PEM キーが application.properties にインライン化され、署名アルゴリズムが RS256 である private_key_jwt:

quarkus.oidc-client.auth-server-url=http://localhost:8180/auth/realms/quarkus/
quarkus.oidc-client.client-id=quarkus-app
quarkus.oidc-client.credentials.jwt.key=Base64-encoded private key representation
Copy to Clipboard Toggle word wrap

PEM キーファイルを使用した private_key_jwt: 署名アルゴリズムは RS256 です。

quarkus.oidc-client.auth-server-url=http://localhost:8180/auth/realms/quarkus/
quarkus.oidc-client.client-id=quarkus-app
quarkus.oidc-client.credentials.jwt.key-file=privateKey.pem
Copy to Clipboard Toggle word wrap

キーストアファイルを含む private_key_jwt: 署名アルゴリズムは RS256 です。

quarkus.oidc-client.auth-server-url=http://localhost:8180/auth/realms/quarkus/
quarkus.oidc-client.client-id=quarkus-app
quarkus.oidc-client.credentials.jwt.key-store-file=keystore.pkcs12
quarkus.oidc-client.credentials.jwt.key-store-password=mypassword
quarkus.oidc-client.credentials.jwt.key-password=mykeypassword

# Private key alias inside the keystore
quarkus.oidc-client.credentials.jwt.key-id=mykeyAlias
Copy to Clipboard Toggle word wrap

client_secret_jwt または private_key_jwt 認証方法を使用すると、クライアントシークレットがネットワーク上に送信されなくなります。

1.1.12.1. 追加の JWT 認証オプション

client_secret_jwt または private_key_jwt のいずれかの認証方法を使用する場合は、JWT 署名アルゴリズム、キー識別子、audience、サブジェクト、発行者をカスタマイズできます。次に例を示します。

# private_key_jwt client authentication

quarkus.oidc-client.auth-server-url=http://localhost:8180/auth/realms/quarkus/
quarkus.oidc-client.client-id=quarkus-app
quarkus.oidc-client.credentials.jwt.key-file=privateKey.pem

# This is a token key identifier 'kid' header - set it if your OpenID Connect provider requires it.
# Note that if the key is represented in a JSON Web Key (JWK) format with a `kid` property, then
# using 'quarkus.oidc-client.credentials.jwt.token-key-id' is unnecessary.
quarkus.oidc-client.credentials.jwt.token-key-id=mykey

# Use the RS512 signature algorithm instead of the default RS256
quarkus.oidc-client.credentials.jwt.signature-algorithm=RS512

# The token endpoint URL is the default audience value; use the base address URL instead:
quarkus.oidc-client.credentials.jwt.audience=${quarkus.oidc-client.auth-server-url}

# custom subject instead of the client ID:
quarkus.oidc-client.credentials.jwt.subject=custom-subject

# custom issuer instead of the client ID:
quarkus.oidc-client.credentials.jwt.issuer=custom-issuer
Copy to Clipboard Toggle word wrap
1.1.12.2. JWT ベアラー

RFC7523 では、JWT ベアラートークンを使用してクライアントを認証する方法を説明しています。詳細は、Using JWTs for Client Authentication セクションを参照してください。

有効にするには、以下を実行します。

quarkus.oidc-client.auth-server-url=${auth-server-url}
quarkus.oidc-client.client-id=quarkus-app
quarkus.oidc-client.credentials.jwt.source=bearer
Copy to Clipboard Toggle word wrap

次に、JWT ベアラートークンを OIDC クライアントに client_assertion パラメーターとして提供する必要があります。

Quarkus はファイルシステムから JWT ベアラートークンをロードすることができます。たとえば、Kubernetes では、サービスアカウントトークンのプロジェクションを /var/run/secrets/tokens パスにマウントできます。後は JWT ベアラートークンパスを次のように設定するだけです。

quarkus.oidc-client.credentials.jwt.token-path=/var/run/secrets/tokens 
1
Copy to Clipboard Toggle word wrap
1
JWT ベアラートークンへのパス。Quarkus はファイルシステムから新しいトークンをロードします。トークンの有効期限が切れるとそれを再ロードします。

他の選択肢としては、追加のグラントパラメーターを受け入れるトークンを取得または更新するための OidcClient メソッド (例: oidcClient.getTokens(Map.of("client_assertion", "ey…​"))) 使用する方法があります。

OIDC クライアントフィルターを使用する場合は、このアサーションを提供するカスタムフィルターを登録する必要があります。

以下は、Quarkus REST (旧称 RESTEasy Reactive) カスタムフィルターの例です。

package io.quarkus.it.keycloak;

import java.util.Map;

import io.quarkus.oidc.client.reactive.filter.runtime.AbstractOidcClientRequestReactiveFilter;
import io.quarkus.oidc.common.runtime.OidcConstants;
import jakarta.annotation.Priority;
import jakarta.ws.rs.Priorities;

@Priority(Priorities.AUTHENTICATION)
public class OidcClientRequestCustomFilter extends AbstractOidcClientRequestReactiveFilter {

    @Override
    protected Map<String, String> additionalParameters() {
        return Map.of(OidcConstants.CLIENT_ASSERTION, "ey...");
    }
}
Copy to Clipboard Toggle word wrap

以下は、RESTEasy Classic カスタムフィルターの例です。

package io.quarkus.it.keycloak;

import java.util.Map;

import io.quarkus.oidc.client.filter.runtime.AbstractOidcClientRequestFilter;
import io.quarkus.oidc.common.runtime.OidcConstants;
import jakarta.annotation.Priority;
import jakarta.ws.rs.Priorities;

@Priority(Priorities.AUTHENTICATION)
public class OidcClientRequestCustomFilter extends AbstractOidcClientRequestFilter {

    @Override
    protected Map<String, String> additionalParameters() {
        return Map.of(OidcConstants.CLIENT_ASSERTION, "ey...");
    }
}
Copy to Clipboard Toggle word wrap
1.1.12.3. Apple POST JWT

Apple OpenID Connect プロバイダーは client_secret_post メソッドを使用します。ここで、シークレットは private_key_jwt 認証メソッドで生成された JWT ですが、Apple アカウント固有の発行者およびサブジェクトプロパティーを持ちます。

quarkus-oidc-client は非標準の client_secret_post_jwt 認証方式をサポートしており、次のように設定できます。

quarkus.oidc-client.auth-server-url=${apple.url}
quarkus.oidc-client.client-id=${apple.client-id}
quarkus.oidc-client.credentials.client-secret.method=post-jwt

quarkus.oidc-client.credentials.jwt.key-file=ecPrivateKey.pem
quarkus.oidc-client.credentials.jwt.signature-algorithm=ES256
quarkus.oidc-client.credentials.jwt.subject=${apple.subject}
quarkus.oidc-client.credentials.jwt.issuer=${apple.issuer}
Copy to Clipboard Toggle word wrap
1.1.12.4. 相互 TLS

一部の OpenID Connect Provider では、相互 TLS (mTLS) 認証プロセスの一部としてクライアントが認証されることが要求されます。

quarkus-oidc-client は、mTLS をサポートするために次のように設定できます。

quarkus.oidc-client.tls.tls-configuration-name=oidc-client

# configure hostname verification if necessary
#quarkus.tls.oidc-client.hostname-verification-algorithm=NONE

# Keystore configuration
quarkus.tls.oidc-client.key-store.p12.path=client-keystore.p12
quarkus.tls.oidc-client.key-store.p12.password=${key-store-password}

# Add more keystore properties if needed:
#quarkus.tls.oidc-client.key-store.p12.alias=keyAlias
#quarkus.tls.oidc-client.key-store.p12.alias-password=keyAliasPassword

# Truststore configuration
quarkus.tls.oidc-client.trust-store.p12.path=client-truststore.p12
quarkus.tls.oidc-client.trust-store.p12.password=${trust-store-password}
# Add more truststore properties if needed:
#quarkus.tls.oidc-client.trust-store.p12.alias=certAlias
Copy to Clipboard Toggle word wrap

1.1.13. OIDC Client SPI

カスタムのエクステンションが、OIDC クライアントでサポートされているいずれかの OIDC トークングラントを使用して OIDC トークンを取得する必要がある場合、そのエクステンションで OIDC Client SPI を利用すれば、OIDC クライアント自体にアクセストークンを必要に応じて取得および更新させることができます。

次の依存関係を追加します。

<dependency>
    <groupId>io.quarkus</groupId>
    <artifactId>quarkus-oidc-client-spi</artifactId>
</dependency>
Copy to Clipboard Toggle word wrap

次に、必要に応じて io.quarkus.oidc.client.spi.TokenProvider CDI Bean を使用するようにエクステンションを更新します。次に例を示します。

package org.acme.extension;

import jakarta.inject.Inject;
import io.quarkus.oidc.client.spi.TokenProvider;

public class ExtensionOAuth2Support {

   @Inject
   TokenProvider tokenProvider;

   public Uni<String> getAccessToken() {
       return tokenProvider.getAccessToken();
   }
}
Copy to Clipboard Toggle word wrap

現在、io.quarkus.oidc.client.spi.TokenProvider は、デフォルトの OIDC クライアントでのみ使用できます。カスタムエクステンションが複数の名前付き OIDC クライアントを認識することはほとんどないためです。

1.1.14. テスト

まず、テストプロジェクトに次の依存関係を追加します。

<dependency>
    <groupId>io.quarkus</groupId>
    <artifactId>quarkus-junit5</artifactId>
    <scope>test</scope>
</dependency>
<dependency>
    <groupId>org.awaitility</groupId>
    <artifactId>awaitility</artifactId>
    <scope>test</scope>
</dependency>
Copy to Clipboard Toggle word wrap
1.1.14.1. Wiremock

テストプロジェクトに次の依存関係を追加します。

<dependency>
    <groupId>org.wiremock</groupId>
    <artifactId>wiremock</artifactId>
    <scope>test</scope>
    <version>${wiremock.version}</version> 
1

</dependency>
Copy to Clipboard Toggle word wrap
1
適切な Wiremock バージョンを使用してください。利用可能なすべてのバージョンを こちら で確認できます。

Wiremock ベースの QuarkusTestResourceLifecycleManager を記述します。以下に例を示します。

package io.quarkus.it.keycloak;

import static com.github.tomakehurst.wiremock.client.WireMock.matching;
import static com.github.tomakehurst.wiremock.core.WireMockConfiguration.wireMockConfig;

import java.util.HashMap;
import java.util.Map;

import com.github.tomakehurst.wiremock.WireMockServer;
import com.github.tomakehurst.wiremock.client.WireMock;
import com.github.tomakehurst.wiremock.core.Options.ChunkedEncodingPolicy;

import io.quarkus.test.common.QuarkusTestResourceLifecycleManager;

public class KeycloakRealmResourceManager implements QuarkusTestResourceLifecycleManager {
    private WireMockServer server;

    @Override
    public Map<String, String> start() {

        server = new WireMockServer(wireMockConfig().dynamicPort().useChunkedTransferEncoding(ChunkedEncodingPolicy.NEVER));
        server.start();

        server.stubFor(WireMock.post("/tokens")
                .withRequestBody(matching("grant_type=password&username=alice&password=alice"))
                .willReturn(WireMock
                        .aResponse()
                        .withHeader("Content-Type", "application/json")
                        .withBody(
                                "{\"access_token\":\"access_token_1\", \"expires_in\":4, \"refresh_token\":\"refresh_token_1\"}")));
        server.stubFor(WireMock.post("/tokens")
                .withRequestBody(matching("grant_type=refresh_token&refresh_token=refresh_token_1"))
                .willReturn(WireMock
                        .aResponse()
                        .withHeader("Content-Type", "application/json")
                        .withBody(
                                "{\"access_token\":\"access_token_2\", \"expires_in\":4, \"refresh_token\":\"refresh_token_1\"}")));


        Map<String, String> conf = new HashMap<>();
        conf.put("keycloak.url", server.baseUrl());
        return conf;
    }

    @Override
    public synchronized void stop() {
        if (server != null) {
            server.stop();
            server = null;
        }
    }
}
Copy to Clipboard Toggle word wrap

REST テストエンドポイントを準備します。注入された MP REST クライアントと登録された OidcClient フィルターを使用するテストフロントエンドエンドポイントで、ダウンストリームエンドポイントを呼び出すことができます。このエンドポイントはトークンをエコーバックします。たとえば、main の Quarkus リポジトリーの integration-tests/oidc-client-wiremock を参照してください。

application.properties を設定します。以下に例を示します。

# Use the 'keycloak.url' property set by the test KeycloakRealmResourceManager
quarkus.oidc-client.auth-server-url=${keycloak.url:replaced-by-test-resource}
quarkus.oidc-client.discovery-enabled=false
quarkus.oidc-client.token-path=/tokens
quarkus.oidc-client.client-id=quarkus-service-app
quarkus.oidc-client.credentials.secret=secret
quarkus.oidc-client.grant.type=password
quarkus.oidc-client.grant-options.password.username=alice
quarkus.oidc-client.grant-options.password.password=alice
Copy to Clipboard Toggle word wrap

最後にテストコードを記述します。上記の Wiremock ベースのリソースを考えると、最初のテスト呼び出しは access_token_1 アクセストークンを返すはずですが、これは 4 秒後に期限切れになります。awaitility を使用して約 5 秒間待機すると、次のテスト呼び出しで access_token_2 アクセストークンが返され、期限切れの access_token_1 アクセストークンが更新されたことが確認されます。

1.1.14.2. Keycloak

Keycloak を使用する場合は、Keycloak の OpenID Connect ベアラートークン結合テスト セクションで説明されているのと同じアプローチを使用できます。

1.1.15. ログ内のエラーを確認する方法

トークンの取得と更新エラーの詳細を確認するには、io.quarkus.oidc.client.runtime.OidcClientImpl TRACE レベルのログ記録を有効にします。

quarkus.log.category."io.quarkus.oidc.client.runtime.OidcClientImpl".level=TRACE
quarkus.log.category."io.quarkus.oidc.client.runtime.OidcClientImpl".min-level=TRACE
Copy to Clipboard Toggle word wrap

OidcClient 初期化エラーの詳細を表示するには、io.quarkus.oidc.client.runtime.OidcClientRecorder TRACE レベルのログ記録を有効にします。

quarkus.log.category."io.quarkus.oidc.client.runtime.OidcClientRecorder".level=TRACE
quarkus.log.category."io.quarkus.oidc.client.runtime.OidcClientRecorder".min-level=TRACE
Copy to Clipboard Toggle word wrap

1.2. OIDC リクエストフィルター

1 つ以上の OidcRequestFilter 実装を登録することで、OIDC クライアントから OIDC プロバイダーへの OIDC リクエストをフィルタリングできます。これにより、新しいリクエストヘッダーを更新または追加したり、リクエストボディーを分析したりすることができます。

1 つのフィルターですべての OIDC プロバイダーエンドポイントへのリクエストをインターセプトすることも、@OidcEndpoint アノテーションを使用してこのフィルターを特定のエンドポイントへのリクエストにのみ適用することもできます。以下に例を示します。

package io.quarkus.it.keycloak;

import jakarta.enterprise.context.ApplicationScoped;

import io.quarkus.arc.Unremovable;
import io.quarkus.oidc.common.OidcEndpoint;
import io.quarkus.oidc.common.OidcRequestFilter;
import io.vertx.core.http.HttpMethod;

@ApplicationScoped
@OidcEndpoint(value = Type.TOKEN)
@Unremovable
public class OidcRequestCustomizer implements OidcRequestFilter {

    @Override
    public void filter(OidcRequestContext requestContext) {
        HttpMethod method = requestContext.request().method();
        String uri = requestContext.request().uri();
        if (method == HttpMethod.POST && uri.endsWith("/token") && requestContext.requestBody() != null) {
            requestContext.request().putHeader("Digest", calculateDigest(requestContext.requestBody().toString()));
        }
    }

    private String calculateDigest(String bodyString) {
        // Apply the required digest algorithm to the body string
    }
}
Copy to Clipboard Toggle word wrap

OidcRequestContextProperties を使用して、リクエストのプロパティーにアクセスできます。現在は、client_id キーを使用してクライアントテナント ID にアクセスできます。また、grant_type キーを使用して、OIDC クライアントがトークンを取得するために使用するグラントタイプにアクセスできます。

1.3. OIDC レスポンスフィルター

1 つ以上の OidcResponseFilter 実装を登録することで、OIDC クライアントリクエストへのレスポンスをフィルタリングできます。これにより、ログへの記録やその他のアクションを実行するために、レスポンスのステータス、ヘッダー、ボディーを確認できます。

1 つのフィルターですべての OIDC クライアントリクエストへのレスポンスをインターセプトすることも、@OidcEndpoint アノテーションを使用して、このフィルターを特定の OIDC クライアントリクエストへのレスポンスにのみ適用することもできます。以下に例を示します。

package io.quarkus.it.keycloak;

import jakarta.enterprise.context.ApplicationScoped;

import org.jboss.logging.Logger;

import io.quarkus.arc.Unremovable;
import io.quarkus.oidc.common.OidcEndpoint;
import io.quarkus.oidc.common.OidcEndpoint.Type;
import io.quarkus.oidc.common.OidcResponseFilter;
import io.quarkus.oidc.common.runtime.OidcConstants;

@ApplicationScoped
@Unremovable
@OidcEndpoint(value = Type.TOKEN) 
1

public class TokenEndpointResponseFilter implements OidcResponseFilter {
    private static final Logger LOG = Logger.getLogger(TokenEndpointResponseFilter.class);

    @Override
    public void filter(OidcResponseContext rc) {
        String contentType = rc.responseHeaders().get("Content-Type"); 
2

        if (contentType.equals("application/json")
                && "refresh_token".equals(rc.requestProperties().get(OidcConstants.GRANT_TYPE)) 
3

                && rc.responseBody().toJsonObject().containsKey("refresh_token")) { 
4

            LOG.debug("Tokens have been refreshed");
        }
    }

}
Copy to Clipboard Toggle word wrap
1
このフィルターを、OIDC トークンエンドポイントを対象とするリクエストだけに制限します。
2
レスポンスの Content-Type ヘッダーを確認します。
3
OidcRequestContextProperties リクエストプロパティーを使用して、それが refresh_grant トークングラントのレスポンスであることを確認します。
4
レスポンス JSON に refresh_token プロパティーが含まれていることを確認します。

1.4. Quarkus REST のトークン伝播

quarkus-rest-client-oidc-token-propagation エクステンションは、認証情報の伝播を簡素化する REST クライアントフィルター io.quarkus.oidc.token.propagation.reactive.AccessTokenRequestReactiveFilter を提供します。このクライアントは、現在アクティブなリクエストに存在する ベアラートークン、または 認可コードフローメカニズム から取得したトークンを、HTTP Authorization ヘッダーの Bearer スキーム値として伝播します。

io.quarkus.oidc.token.propagation.common.AccessToken または org.eclipse.microprofile.rest.client.annotation.RegisterProvider アノテーションのいずれかを使用して、AccessTokenRequestReactiveFilter を選択的に登録できます。次に例を示します。

import org.eclipse.microprofile.rest.client.inject.RegisterRestClient;
import io.quarkus.oidc.token.propagation.common.AccessToken;
import jakarta.ws.rs.GET;
import jakarta.ws.rs.Path;

@RegisterRestClient
@AccessToken
@Path("/")
public interface ProtectedResourceService {

    @GET
    String getUserName();
}
Copy to Clipboard Toggle word wrap

または

import org.eclipse.microprofile.rest.client.annotation.RegisterProvider;
import org.eclipse.microprofile.rest.client.inject.RegisterRestClient;
import io.quarkus.oidc.token.propagation.reactive.AccessTokenRequestReactiveFilter;
import jakarta.ws.rs.GET;
import jakarta.ws.rs.Path;

@RegisterRestClient
@RegisterProvider(AccessTokenRequestReactiveFilter.class)
@Path("/")
public interface ProtectedResourceService {

    @GET
    String getUserName();
}
Copy to Clipboard Toggle word wrap

さらに、AccessTokenRequestReactiveFilter は、トークンを伝播する前に交換する必要がある複雑なアプリケーションをサポートできます。

Keycloak または Token Exchange トークングラントをサポートする別の OIDC プロバイダーを使用する場合は、次のように AccessTokenRequestReactiveFilter を設定してトークンを交換できます。

quarkus.oidc-client.auth-server-url=http://localhost:8180/auth/realms/quarkus
quarkus.oidc-client.client-id=quarkus-app
quarkus.oidc-client.credentials.secret=secret
quarkus.oidc-client.grant.type=exchange
quarkus.oidc-client.grant-options.exchange.audience=quarkus-app-exchange

quarkus.rest-client-oidc-token-propagation.exchange-token=true 
1
Copy to Clipboard Toggle word wrap
1
OidcClient 名が io.quarkus.oidc.token.propagation.common.AccessToken#exchangeTokenClient アノテーション属性で設定されている場合、exchange-token 設定プロパティーは無視されることに注意してください。
注記

AccessTokenRequestReactiveFilterOidcClient を使用して現在のトークンを交換します。quarkus.oidc-client.grant-options.exchange を使用すると、OpenID Connect プロバイダーが要求する追加の交換プロパティーを設定できます。

現在のトークンを交換するために JWT ベアラートークングラント使用する必要がある Azure などのプロバイダーを使用する場合は、次のように AccessTokenRequestReactiveFilter を設定してトークンを交換できます。

quarkus.oidc-client.auth-server-url=${azure.provider.url}
quarkus.oidc-client.client-id=quarkus-app
quarkus.oidc-client.credentials.secret=secret

quarkus.oidc-client.grant.type=jwt
quarkus.oidc-client.grant-options.jwt.requested_token_use=on_behalf_of
quarkus.oidc-client.scopes=https://graph.microsoft.com/user.read,offline_access

quarkus.resteasy-client-oidc-token-propagation.exchange-token=true
Copy to Clipboard Toggle word wrap

AccessTokenRequestReactiveFilter はデフォルトの OidcClient を使用します。名前付きの OidcClient は、quarkus.rest-client-oidc-token-propagation.client-name 設定プロパティー、または io.quarkus.oidc.token.propagation.common.AccessToken#exchangeTokenClient アノテーション属性を使用して選択できます。

1.5. RESTEasy Classic のトークン伝播

quarkus-resteasy-client-oidc-token-propagation エクステンションは、認証情報の伝播を簡素化する 2 つの Jakarta REST jakarta.ws.rs.client.ClientRequestFilter クラス実装を提供します。io.quarkus.oidc.token.propagation.AccessTokenRequestFilter は、現在アクティブなリクエストに存在する ベアラートークン、または 認可コードフローメカニズム から取得されたトークンを、HTTP Authorization ヘッダーの Bearer スキーム値として伝播します。io.quarkus.oidc.token.propagation.JsonWebTokenRequestFilter は同じ機能を提供しますが、さらに JWT トークンのサポートも提供します。

現在の認可コードフローアクセストークンを伝播する必要がある場合は、即時トークン伝播が適切に機能します。これは、(ID トークンではなく) コードフローアクセストークンが、現在認証されているユーザーに代わってリモートサービスにアクセスするために現在の Quarkus エンドポイントに伝播されることを意図したものであるためです。

ただし、エンドツーエンドの Bearer トークンの直接的な伝播は回避する必要があります。たとえば、Client → Service A → Service B の場合、Service BClient から Service A に送信されたトークンを受信します。このような場合、Service B はトークンが Service A から来たものか、Client から直接来たものか区別できません。トークンが Service A から送信されたことを Service B が確認するには、新しい発行者と audience クレームをアサートできる必要があります。

さらに、複雑なアプリケーションでは、トークンを伝播する前に交換または更新しないといけない場合があります。たとえば、Service AService B にアクセスする場合、アクセスコンテキストが異なる場合があります。この場合、Service A には、Service B にアクセスするための狭い範囲またはまったく異なる範囲のセットが付与される可能性があります。

次のセクションでは、AccessTokenRequestFilterJsonWebTokenRequestFilter がどのように役立つかを示します。

1.5.1. RestClient AccessTokenRequestFilter

AccessTokenRequestFilter はすべてのトークンを文字列として扱うため、JWT トークンと不透明トークンの両方で動作します。

io.quarkus.oidc.token.propagation.common.AccessToken または org.eclipse.microprofile.rest.client.annotation.RegisterProvider のいずれかを使用して、AccessTokenRequestFilter を選択的に登録できます。次に例を示します。

import org.eclipse.microprofile.rest.client.inject.RegisterRestClient;
import io.quarkus.oidc.token.propagation.common.AccessToken;
import jakarta.ws.rs.GET;
import jakarta.ws.rs.Path;

@RegisterRestClient
@AccessToken
@Path("/")
public interface ProtectedResourceService {

    @GET
    String getUserName();
}
Copy to Clipboard Toggle word wrap

または

import org.eclipse.microprofile.rest.client.annotation.RegisterProvider;
import org.eclipse.microprofile.rest.client.inject.RegisterRestClient;
import io.quarkus.oidc.token.propagation.AccessTokenRequestFilter;
import jakarta.ws.rs.GET;
import jakarta.ws.rs.Path;

@RegisterRestClient
@RegisterProvider(AccessTokenRequestFilter.class)
@Path("/")
public interface ProtectedResourceService {

    @GET
    String getUserName();
}
Copy to Clipboard Toggle word wrap

または、quarkus.resteasy-client-oidc-token-propagation.register-filter プロパティーが true に設定され、quarkus.resteasy-client-oidc-token-propagation.json-web-token プロパティーが false (デフォルト値) に設定されている場合、AccessTokenRequestFilter はすべての MP Rest または Jakarta REST クライアントに自動的に登録されます。

1.5.1.1. 伝播前のトークンの交換

現在のアクセストークンを伝播前に交換する必要があり、Token Exchange トークングラントをサポートする Keycloak またはその他の OpenID Connect Provider を使用する場合は、AccessTokenRequestFilter を次のように設定できます。

quarkus.oidc-client.auth-server-url=http://localhost:8180/auth/realms/quarkus
quarkus.oidc-client.client-id=quarkus-app
quarkus.oidc-client.credentials.secret=secret
quarkus.oidc-client.grant.type=exchange
quarkus.oidc-client.grant-options.exchange.audience=quarkus-app-exchange

quarkus.resteasy-client-oidc-token-propagation.exchange-token=true
Copy to Clipboard Toggle word wrap

現在のトークンを交換するために JWT ベアラートークングラント使用する必要がある Azure などのプロバイダーを使用する場合は、次のように AccessTokenRequestFilter を設定してトークンを交換できます。

quarkus.oidc-client.auth-server-url=${azure.provider.url}
quarkus.oidc-client.client-id=quarkus-app
quarkus.oidc-client.credentials.secret=secret

quarkus.oidc-client.grant.type=jwt
quarkus.oidc-client.grant-options.jwt.requested_token_use=on_behalf_of
quarkus.oidc-client.scopes=https://graph.microsoft.com/user.read,offline_access

quarkus.resteasy-client-oidc-token-propagation.exchange-token=true
Copy to Clipboard Toggle word wrap
注記

AccessTokenRequestFilterOidcClient を使用して現在のトークンを交換します。quarkus.oidc-client.grant-options.exchange を使用して、OpenID Connect プロバイダーが要求する追加の交換プロパティーを設定できます。

AccessTokenRequestFilter はデフォルトの OidcClient を使用します。名前付きの OidcClient は、quarkus.resteasy-client-oidc-token-propagation.client-name 設定プロパティーを使用して選択できます。

1.5.2. RestClient JsonWebTokenRequestFilter

Bearer JWT トークンを使用する場合、issueraudience などのトークンのクレームを変更したり、更新されたトークンを再度保護 (再署名など) したりできる場合は、JsonWebTokenRequestFilter を使用することを推奨します。注入された org.eclipse.microprofile.jwt.JsonWebToken が想定されるため、不透明なトークンでは機能しません。また、OpenID Connect Provider が Token Exchange プロトコルをサポートしている場合は、代わりに AccessTokenRequestFilter を使用することを推奨します。AccessTokenRequestFilter を使用すると、JWT と不透明ベアラートークンの両方を安全に交換できるためです。

JsonWebTokenRequestFilter を使用すると、Service A の実装で、注入された org.eclipse.microprofile.jwt.JsonWebToken を新しい issueraudience のクレーム値で簡単に更新し、更新されたトークンを新しい署名で再度保護できるようになります。唯一の難しいステップは、Service A に署名鍵があることを確認することです。この署名鍵は、セキュアなファイルシステムまたは Vault などのリモートのセキュアなストレージからプロビジョニングする必要があります。

io.quarkus.oidc.token.propagation.JsonWebToken または org.eclipse.microprofile.rest.client.annotation.RegisterProvider のいずれかを使用して、JsonWebTokenRequestFilter を選択的に登録できます。次に例を示します。

import org.eclipse.microprofile.rest.client.inject.RegisterRestClient;
import io.quarkus.oidc.token.propagation.JsonWebToken;
import jakarta.ws.rs.GET;
import jakarta.ws.rs.Path;

@RegisterRestClient
@JsonWebToken
@Path("/")
public interface ProtectedResourceService {

    @GET
    String getUserName();
}
Copy to Clipboard Toggle word wrap

または

import org.eclipse.microprofile.rest.client.annotation.RegisterProvider;
import org.eclipse.microprofile.rest.client.inject.RegisterRestClient;
import io.quarkus.oidc.token.propagation.JsonWebTokenRequestFilter;
import jakarta.ws.rs.GET;
import jakarta.ws.rs.Path;

@RegisterRestClient
@RegisterProvider(JsonWebTokenRequestFilter.class)
@Path("/")
public interface ProtectedResourceService {

    @GET
    String getUserName();
}
Copy to Clipboard Toggle word wrap

または、quarkus.resteasy-client-oidc-token-propagation.register-filter プロパティーと quarkus.resteasy-client-oidc-token-propagation.json-web-token プロパティーの両方が true に設定されている場合、JsonWebTokenRequestFilter はすべての MicroProfile REST または Jakarta REST クライアントに自動的に登録できます。

1.5.2.1. 伝播前のトークンの更新

注入されたトークンの iss (issuer) または aud (audience) クレームを更新し、新しい署名で再度保護する必要がある場合は、次のように JsonWebTokenRequestFilter を設定できます。

quarkus.resteasy-client-oidc-token-propagation.secure-json-web-token=true
smallrye.jwt.sign.key.location=/privateKey.pem
# Set a new issuer
smallrye.jwt.new-token.issuer=http://frontend-resource
# Set a new audience
smallrye.jwt.new-token.audience=http://downstream-resource
# Override the existing token issuer and audience claims if they are already set
smallrye.jwt.new-token.override-matching-claims=true
Copy to Clipboard Toggle word wrap

前述のように、Keycloak または Token Exchange プロトコルをサポートする OpenID Connect Provider を使用する場合は、AccessTokenRequestFilter を使用します。

1.5.3. テスト

通常、2 つの REST テストエンドポイントを準備する必要があります。最初のエンドポイントは、登録済みのトークン伝播フィルターを備えた注入された MP REST クライアントを使用して、2 番目のエンドポイントを呼び出します。

これを実行する方法は、OpenID Connect クライアントとトークンの伝播 クイックスタート、特に テスト セクションを参照してください。

1.6. 設定の参照

1.6.1. OIDC クライアント

🔒 ビルド時に固定: 設定プロパティーはビルド時に固定されます。他のすべての設定プロパティーは実行時にオーバーライドできます。

Expand

設定プロパティー

デフォルト

🔒 ビルド時に固定 quarkus.oidc-client.enabled

OIDC クライアントエクステンションを有効にするかどうか。

環境変数: QUARKUS_OIDC_CLIENT_ENABLED

boolean

true

quarkus.oidc-client.auth-server-url

quarkus.oidc-client."id".auth-server-url

OpenID Connect (OIDC) サーバーのベース URL (例: https://host:port/auth)。'quarkus-oidc' を使用し、公開鍵 (public-key) の検証または証明書チェーン (certificate-chain) の検証のみが必要な場合は、このプロパティーを設定しないでください。OIDC 検出エンドポイントは、この URL に .well-known/openid-configuration パスを追加することによって、デフォルトで呼び出されます。Keycloak の場合は、https://host:port/realms/{realm} を使用します。ここで、{realm} を Keycloak レルム名に置き換えます。

環境変数: QUARKUS_OIDC_CLIENT_AUTH_SERVER_URL

string

 

quarkus.oidc-client.discovery-enabled

quarkus.oidc-client."id".discovery-enabled

OIDC エンドポイントの検出。有効になっていない場合は、OIDC エンドポイント URL を個別に設定する必要があります。

環境変数: QUARKUS_OIDC_CLIENT_DISCOVERY_ENABLED

boolean

true

quarkus.oidc-client.registration-path

quarkus.oidc-client."id".registration-path

OIDC 動的クライアント登録エンドポイントの相対パスまたは絶対 URL。discovery-enabledfalse の場合、または検出されたトークンエンドポイントパスをカスタマイズする必要がある場合に設定します。

環境変数: QUARKUS_OIDC_CLIENT_REGISTRATION_PATH

string

 

quarkus.oidc-client.connection-delay

quarkus.oidc-client."id".connection-delay

OIDC サーバーへの初期接続を試行する期間。たとえば、期間を 20S に設定すると、2 秒間隔で 10 回の再試行が可能になります。このプロパティーは、最初の OIDC 接続が作成された時のみ有効です。接続が切断された場合は、代わりに connection-retry-count プロパティーを使用します。

環境変数: QUARKUS_OIDC_CLIENT_CONNECTION_DELAY

Durationℹ️ 期間のフォーマット

 

quarkus.oidc-client.connection-retry-count

quarkus.oidc-client."id".connection-retry-count

既存の OIDC 接続が一時的に失われた場合に、再確立を再試行する回数。最初の接続試行にのみ適用される connection-delay とは異なります。たとえば、接続の問題により OIDC トークンエンドポイントへのリクエストが失敗した場合、この設定に従って再試行されます。

環境変数: QUARKUS_OIDC_CLIENT_CONNECTION_RETRY_COUNT

int

3

quarkus.oidc-client.connection-timeout

quarkus.oidc-client."id".connection-timeout

現在の OIDC 接続リクエストがタイムアウトするまでの秒数。

環境変数: QUARKUS_OIDC_CLIENT_CONNECTION_TIMEOUT

Durationℹ️ 期間のフォーマット

10S

quarkus.oidc-client.use-blocking-dns-lookup

quarkus.oidc-client."id".use-blocking-dns-lookup

DNS ルックアップをワーカースレッドで実行するかどうか。このオプションは、OIDC サーバーへの HTTP リクエストによってブロックされた Vert.x イベントループに関するログに記録された警告を確認できる場合に使用してください。

環境変数: QUARKUS_OIDC_CLIENT_USE_BLOCKING_DNS_LOOKUP

boolean

false

quarkus.oidc-client.max-pool-size

quarkus.oidc-client."id".max-pool-size

WebClient が使用する接続プールの最大サイズ。

環境変数: QUARKUS_OIDC_CLIENT_MAX_POOL_SIZE

int

 

quarkus.oidc-client.follow-redirects

quarkus.oidc-client."id".follow-redirects

WebClient が HTTP 302 を取得すると、リダイレクトを自動的に実行します。このプロパティーが無効な場合、リダイレクト要求時に 1 つ以上の Cookie が設定されている場合にのみ、まったく同じ元の URI へのリダイレクトが 1 回だけ許可されます。

環境変数: QUARKUS_OIDC_CLIENT_FOLLOW_REDIRECTS

boolean

true

quarkus.oidc-client.token-path

quarkus.oidc-client."id".token-path

アクセストークンとリフレッシュトークンを発行する OIDC トークンエンドポイント。相対パスまたは絶対 URL として指定されます。discovery-enabledfalse の場合、または検出されたトークンエンドポイントパスをカスタマイズする必要がある場合に設定します。

環境変数: QUARKUS_OIDC_CLIENT_TOKEN_PATH

string

 

quarkus.oidc-client.revoke-path

quarkus.oidc-client."id".revoke-path

OIDC トークン失効エンドポイントの相対パスまたは絶対 URL。

環境変数: QUARKUS_OIDC_CLIENT_REVOKE_PATH

string

 

quarkus.oidc-client.client-id

quarkus.oidc-client."id".client-id

アプリケーションのクライアント ID各アプリケーションには、アプリケーションを識別するために使用されるクライアント ID があります。application-typeservice で、トークンイントロスペクションが不要な場合は、クライアント ID を設定する必要はありません。

環境変数: QUARKUS_OIDC_CLIENT_CLIENT_ID

string

 

quarkus.oidc-client.client-name

quarkus.oidc-client."id".client-name

アプリケーションのクライアント名。これは、アプリケーション (クライアント) が OpenId Connect プロバイダーのダッシュボードに登録されるときに提供できる、人間が判読できる形式のアプリケーションの説明を示すことを目的としています。たとえば、このプロパティーを設定すると、特定のクライアントのアクティビティーを記録した、より有益なログメッセージを取得できます。

環境変数: QUARKUS_OIDC_CLIENT_CLIENT_NAME

string

 

quarkus.oidc-client.id

quarkus.oidc-client."id".id

一意の OIDC クライアント識別子。OIDC クライアントが動的に作成される場合は設定する必要があります。そうでない場合は任意です。

環境変数: QUARKUS_OIDC_CLIENT_ID

string

 

quarkus.oidc-client.client-enabled

quarkus.oidc-client."id".client-enabled

このクライアント設定を有効にするかどうか。

環境変数: QUARKUS_OIDC_CLIENT_CLIENT_ENABLED

boolean

true

quarkus.oidc-client.scopes

quarkus.oidc-client."id".scopes

アクセストークンのスコープのリスト

環境変数: QUARKUS_OIDC_CLIENT_SCOPES

list of string

 

quarkus.oidc-client.refresh-token-time-skew

quarkus.oidc-client."id".refresh-token-time-skew

リフレッシュトークンの時間のずれ。このプロパティーを有効にすると、アクセストークンを更新する必要があるかどうかを確認するときに、設定した期間が秒数に変換され、現在の時刻に追加されます。合計がこのアクセストークンの有効期限よりも大きい場合は、更新が行われます。

環境変数: QUARKUS_OIDC_CLIENT_REFRESH_TOKEN_TIME_SKEW

Durationℹ️ 期間のフォーマット

 

quarkus.oidc-client.access-token-expires-in

quarkus.oidc-client."id".access-token-expires-in

現在の時刻を基準としたアクセストークンの有効期限。このプロパティーは、アクセストークングラントのレスポンスにアクセストークンの有効期限プロパティーが含まれていない場合にのみチェックされます。

環境変数: QUARKUS_OIDC_CLIENT_ACCESS_TOKEN_EXPIRES_IN

Durationℹ️ 期間のフォーマット

 

quarkus.oidc-client.access-token-expiry-skew

quarkus.oidc-client."id".access-token-expiry-skew

計算されたトークン有効期限に追加できるアクセストークン有効期限のずれ。

環境変数: QUARKUS_OIDC_CLIENT_ACCESS_TOKEN_EXPIRY_SKEW

Durationℹ️ 期間のフォーマット

 

quarkus.oidc-client.absolute-expires-in

quarkus.oidc-client."id".absolute-expires-in

アクセストークンの 'expires_in' プロパティーを、現在の時刻に対する相対的な期間ではなく、絶対的な時間値としてチェックするかどうか。

環境変数: QUARKUS_OIDC_CLIENT_ABSOLUTE_EXPIRES_IN

boolean

false

quarkus.oidc-client.grant.type

quarkus.oidc-client."id".grant.type

グラントタイプ

環境変数: QUARKUS_OIDC_CLIENT_GRANT_TYPE

client: 'client_credentials' グラント。これは、OIDC クライアント認証だけを必要とします。

password: 'password' グラント。これは、OIDC クライアント認証とユーザー ('username' と 'password') 認証の両方を必要とします。

code: 'authorization_code' グラント。これは、OIDC クライアント認証と、トークンリクエスト時に OidcClient に渡す必要がある 'code' および 'redirect_uri' パラメーターを少なくとも必要とします。

exchange: 'urn:ietf:params:oauth:grant-type:token-exchange' グラント。これは、OIDC クライアント認証と、トークンリクエスト時に OidcClient に渡す必要がある 'subject_token' パラメーターを少なくとも必要とします。

jwt: 'urn:ietf:params:oauth:grant-type:jwt-bearer' グラント。これは、OIDC クライアント認証と、トークンリクエスト時に OidcClient に渡す必要がある 'assertion' パラメーターを少なくとも必要とします。

refresh: 'refresh_token' グラント。これは、OIDC クライアント認証とリフレッシュトークンを必要とします。なお、アクセストークン取得レスポンスにリフレッシュトークンが含まれている場合、OidcClient はデフォルトでこのグラントをサポートします。ただし、場合によっては、リフレッシュトークンが帯域外で提供されることもあります。たとえば、リフレッシュトークンが複数の機密クライアントのサービス間で共有されることがあります。'quarkus.oidc-client.grant-type' が 'refresh' に設定されている場合、OidcClient はトークンの更新のみをサポートします。

ciba: 'urn:openid:params:grant-type:ciba' グラント。これは、OIDC クライアント認証と、トークンリクエスト時に OidcClient に渡す必要がある 'auth_req_id' パラメーターを必要とします。

device: 'urn:ietf:params:oauth:grant-type:device_code' グラント。これは、OIDC クライアント認証と、トークンリクエスト時に OidcClient に渡す必要がある 'device_code' パラメーターを必要とします。

client

quarkus.oidc-client.grant.access-token-property

quarkus.oidc-client."id".grant.access-token-property

トークングラントレスポンス内のアクセストークンプロパティー名

環境変数: QUARKUS_OIDC_CLIENT_GRANT_ACCESS_TOKEN_PROPERTY

string

access_token

quarkus.oidc-client.grant.refresh-token-property

quarkus.oidc-client."id".grant.refresh-token-property

トークングラントレスポンス内のトークンプロパティー名の更新

環境変数: QUARKUS_OIDC_CLIENT_GRANT_REFRESH_TOKEN_PROPERTY

string

refresh_token

quarkus.oidc-client.grant.expires-in-property

quarkus.oidc-client."id".grant.expires-in-property

トークングラントレスポンス内のアクセストークンの有効期限プロパティー名

環境変数: QUARKUS_OIDC_CLIENT_GRANT_EXPIRES_IN_PROPERTY

string

expires_in

quarkus.oidc-client.grant.refresh-expires-in-property

quarkus.oidc-client."id".grant.refresh-expires-in-property

トークングラントレスポンス内のトークン有効期限プロパティー名の更新

環境変数: QUARKUS_OIDC_CLIENT_GRANT_REFRESH_EXPIRES_IN_PROPERTY

string

refresh_expires_in

quarkus.oidc-client.grant-options."grant-name"

quarkus.oidc-client."id".grant-options."grant-name"

グラントオプション

環境変数: QUARKUS_OIDC_CLIENT_GRANT_OPTIONS__GRANT_NAME_

Map<String,Map<String,String>>

 

quarkus.oidc-client.early-tokens-acquisition

quarkus.oidc-client."id".early-tokens-acquisition

'OidcClient' を使用するすべてのフィルターが、構築後の初期化時にトークンを取得することを必須にします。この初期化は、これらのトークンが使用されるはるか前に行われる可能性があります。アクセストークンが初めて使用される前に期限切れになる可能性があり、リフレッシュトークンが利用できない場合は、このプロパティーを無効にする必要があります。

環境変数: QUARKUS_OIDC_CLIENT_EARLY_TOKENS_ACQUISITION

boolean

true

quarkus.oidc-client.headers."headers"

quarkus.oidc-client."id".headers."headers"

トークンエンドポイントに送信する必要があるカスタム HTTP ヘッダー

環境変数: QUARKUS_OIDC_CLIENT_HEADERS__HEADERS_

Map<String,String>

 

HTTP プロキシー設定

デフォルト

quarkus.oidc-client.proxy.host

quarkus.oidc-client."id".proxy.host

プロキシーのホスト名または IP アドレス。
注記: OIDC アダプターが OIDC サーバー (プロバイダー) と通信するためにプロキシーを必要とする場合は、この値を設定してプロキシーの使用を有効にします。

環境変数: QUARKUS_OIDC_CLIENT_PROXY_HOST

string

 

quarkus.oidc-client.proxy.port

quarkus.oidc-client."id".proxy.port

プロキシーのポート番号。デフォルト値は 80 です。

環境変数: QUARKUS_OIDC_CLIENT_PROXY_PORT

int

80

quarkus.oidc-client.proxy.username

quarkus.oidc-client."id".proxy.username

プロキシーに認証が必要な場合のユーザー名。

環境変数: QUARKUS_OIDC_CLIENT_PROXY_USERNAME

string

 

quarkus.oidc-client.proxy.password

quarkus.oidc-client."id".proxy.password

プロキシーに認証が必要な場合のパスワード。

環境変数: QUARKUS_OIDC_CLIENT_PROXY_PASSWORD

string

 

TLS 設定

デフォルト

quarkus.oidc-client.tls.tls-configuration-name

quarkus.oidc-client."id".tls.tls-configuration-name

使用する TLS 設定の名前。

名前が設定されている場合は、quarkus.tls.<name>.* の設定が使用されます。名前が設定されていても、その名前の TLS 設定が見つからない場合は、エラーが出力されます。

デフォルトの TLS 設定はデフォルトでは 使用されません

環境変数: QUARKUS_OIDC_CLIENT_TLS_TLS_CONFIGURATION_NAME

string

 

OIDC クライアントが OIDC トークンやその他の保護されたエンドポイントにアクセスするためのさまざまな認証オプション

デフォルト

quarkus.oidc-client.credentials.secret

quarkus.oidc-client."id".credentials.secret

client_secret_basic 認証方法で使用されるクライアントシークレット。client-secret にシークレットが設定されている場合、または jwt クライアント認証が必要な場合を除いて、設定する必要があります。代わりに client-secret.value を使用することもできますが、両方のプロパティーは相互に排他的です。

環境変数: QUARKUS_OIDC_CLIENT_CREDENTIALS_SECRET

string

 

quarkus.oidc-client.credentials.client-secret.value

quarkus.oidc-client."id".credentials.client-secret.value

クライアントシークレットの値。credentials.secret が設定されている場合、この値は無視されます。client-secret にシークレットが設定されている場合、または jwt クライアント認証が必要な場合を除いて、設定する必要があります。

環境変数: QUARKUS_OIDC_CLIENT_CREDENTIALS_CLIENT_SECRET_VALUE

string

 

quarkus.oidc-client.credentials.client-secret.provider.name

quarkus.oidc-client."id".credentials.client-secret.provider.name

CredentialsProvider Bean 名。複数の CredentialsProvider が登録されている場合にのみ設定する必要があります。

環境変数: QUARKUS_OIDC_CLIENT_CREDENTIALS_CLIENT_SECRET_PROVIDER_NAME

string

 

quarkus.oidc-client.credentials.client-secret.provider.keyring-name

quarkus.oidc-client."id".credentials.client-secret.provider.keyring-name

CredentialsProvider のキーリング名。キーリング名は、使用されている CredentialsProvider がシークレットを検索するためにキーリング名を必要とする場合にのみ必要です。これは、vault インスタンスやシークレットマネージャーなど、より動的なソースから認証情報を取得するために、CredentialsProvider が複数のエクステンションによって共有される場合によく発生します。

環境変数: QUARKUS_OIDC_CLIENT_CREDENTIALS_CLIENT_SECRET_PROVIDER_KEYRING_NAME

string

 

quarkus.oidc-client.credentials.client-secret.provider.key

quarkus.oidc-client."id".credentials.client-secret.provider.key

CredentialsProvider クライアントのシークレットキー

環境変数: QUARKUS_OIDC_CLIENT_CREDENTIALS_CLIENT_SECRET_PROVIDER_KEY

string

 

quarkus.oidc-client.credentials.client-secret.method

quarkus.oidc-client."id".credentials.client-secret.method

認証方法。clientSecret.value シークレットが設定されている場合、この方法はデフォルトで basic になります。

環境変数: QUARKUS_OIDC_CLIENT_CREDENTIALS_CLIENT_SECRET_METHOD

basic: client_secret_basic (デフォルト): クライアント ID とシークレットが、HTTP 認可基本スキームを使用して送信されます。

post: client_secret_post: クライアント ID とシークレットが、client_id および client_secret フォームパラメーターとして送信されます。

post-jwt: client_secret_jwt: クライアント ID と生成された JWT シークレットが、client_id および client_secret フォームパラメーターとして送信されます。

query: クライアント ID とシークレットが、HTTP クエリーパラメーターとして送信されます。このオプションは OIDC エクステンションでのみサポートされます。

 

quarkus.oidc-client.credentials.jwt.source

quarkus.oidc-client."id".credentials.jwt.source

JWT トークンソース: OIDC プロバイダークライアントまたは既存の JWT ベアラートークン。

環境変数: QUARKUS_OIDC_CLIENT_CREDENTIALS_JWT_SOURCE

client: JWT トークンが、client_secret_jwt および private_key_jwt 認証方式をサポートするために、OIDC プロバイダークライアントによって生成されます。

bearer: JWT ベアラートークンがクライアントアサーションとして使用されます (https://www.rfc-editor.org/rfc/rfc7523#section-2.2)。

client

quarkus.oidc-client.credentials.jwt.token-path

quarkus.oidc-client."id".credentials.jwt.token-path

クライアントアサーションとして使用する必要がある JWT ベアラートークンを含むファイルへのパス。このパスは、JWT ソース (source()) が Source#BEARER に設定されている場合にのみ設定できます。

環境変数: QUARKUS_OIDC_CLIENT_CREDENTIALS_JWT_TOKEN_PATH

path

 

quarkus.oidc-client.credentials.jwt.secret

quarkus.oidc-client."id".credentials.jwt.secret

指定されている場合、JWT がシークレットキーを使用して署名されていることを示します。これは、keykey-file、および key-store プロパティーと相互に排他的です。

環境変数: QUARKUS_OIDC_CLIENT_CREDENTIALS_JWT_SECRET

string

 

quarkus.oidc-client.credentials.jwt.secret-provider.name

quarkus.oidc-client."id".credentials.jwt.secret-provider.name

CredentialsProvider Bean 名。複数の CredentialsProvider が登録されている場合にのみ設定する必要があります。

環境変数: QUARKUS_OIDC_CLIENT_CREDENTIALS_JWT_SECRET_PROVIDER_NAME

string

 

quarkus.oidc-client.credentials.jwt.secret-provider.keyring-name

quarkus.oidc-client."id".credentials.jwt.secret-provider.keyring-name

CredentialsProvider のキーリング名。キーリング名は、使用されている CredentialsProvider がシークレットを検索するためにキーリング名を必要とする場合にのみ必要です。これは、vault インスタンスやシークレットマネージャーなど、より動的なソースから認証情報を取得するために、CredentialsProvider が複数のエクステンションによって共有される場合によく発生します。

環境変数: QUARKUS_OIDC_CLIENT_CREDENTIALS_JWT_SECRET_PROVIDER_KEYRING_NAME

string

 

quarkus.oidc-client.credentials.jwt.secret-provider.key

quarkus.oidc-client."id".credentials.jwt.secret-provider.key

CredentialsProvider クライアントのシークレットキー

環境変数: QUARKUS_OIDC_CLIENT_CREDENTIALS_JWT_SECRET_PROVIDER_KEY

string

 

quarkus.oidc-client.credentials.jwt.key

quarkus.oidc-client."id".credentials.jwt.key

秘密鍵の文字列表現。指定されている場合、PEM または JWK 形式の秘密鍵を使用して JWT が署名されていることを示します。これは、secretkey-file、および key-store プロパティーと相互に排他的です。signature-algorithm プロパティーを使用して、デフォルトのキーアルゴリズム RS256 をオーバーライドできます。

環境変数: QUARKUS_OIDC_CLIENT_CREDENTIALS_JWT_KEY

string

 

quarkus.oidc-client.credentials.jwt.key-file

quarkus.oidc-client."id".credentials.jwt.key-file

指定されている場合、PEM または JWK 形式の秘密鍵を使用して JWT が署名されていることを示します。これは、secretkey、および key-store プロパティーと相互に排他的です。signature-algorithm プロパティーを使用して、デフォルトのキーアルゴリズム RS256 をオーバーライドできます。

環境変数: QUARKUS_OIDC_CLIENT_CREDENTIALS_JWT_KEY_FILE

string

 

quarkus.oidc-client.credentials.jwt.key-store-file

quarkus.oidc-client."id".credentials.jwt.key-store-file

指定されている場合、JWT はキーストアの秘密鍵を使用して署名されていることを示します。これは、secretkey、および key-file プロパティーと相互に排他的です。

環境変数: QUARKUS_OIDC_CLIENT_CREDENTIALS_JWT_KEY_STORE_FILE

string

 

quarkus.oidc-client.credentials.jwt.key-store-password

quarkus.oidc-client."id".credentials.jwt.key-store-password

キーストアファイルのパスワードを指定するためのパラメーター。

環境変数: QUARKUS_OIDC_CLIENT_CREDENTIALS_JWT_KEY_STORE_PASSWORD

string

 

quarkus.oidc-client.credentials.jwt.key-id

quarkus.oidc-client."id".credentials.jwt.key-id

秘密鍵の ID またはエイリアス。

環境変数: QUARKUS_OIDC_CLIENT_CREDENTIALS_JWT_KEY_ID

string

 

quarkus.oidc-client.credentials.jwt.key-password

quarkus.oidc-client."id".credentials.jwt.key-password

秘密鍵のパスワード。

環境変数: QUARKUS_OIDC_CLIENT_CREDENTIALS_JWT_KEY_PASSWORD

string

 

quarkus.oidc-client.credentials.jwt.audience

quarkus.oidc-client."id".credentials.jwt.audience

JWT オーディエンス (aud) クレーム値。デフォルトでは、オーディエンスは OpenId Connect プロバイダーのトークンエンドポイントのアドレスに設定されます。

環境変数: QUARKUS_OIDC_CLIENT_CREDENTIALS_JWT_AUDIENCE

string

 

quarkus.oidc-client.credentials.jwt.token-key-id

quarkus.oidc-client."id".credentials.jwt.token-key-id

JWT kid ヘッダーとして追加された署名キーのキー識別子。

環境変数: QUARKUS_OIDC_CLIENT_CREDENTIALS_JWT_TOKEN_KEY_ID

string

 

quarkus.oidc-client.credentials.jwt.issuer

quarkus.oidc-client."id".credentials.jwt.issuer

JWT iss クレームとして追加された署名キーの発行者。デフォルト値はクライアント ID です。

環境変数: QUARKUS_OIDC_CLIENT_CREDENTIALS_JWT_ISSUER

string

 

quarkus.oidc-client.credentials.jwt.subject

quarkus.oidc-client."id".credentials.jwt.subject

JWT sub クレームとして追加された署名キーのサブジェクト。デフォルト値はクライアント ID です。

環境変数: QUARKUS_OIDC_CLIENT_CREDENTIALS_JWT_SUBJECT

string

 

quarkus.oidc-client.credentials.jwt.claims."claim-name"

quarkus.oidc-client."id".credentials.jwt.claims."claim-name"

追加のクレーム。

環境変数: QUARKUS_OIDC_CLIENT_CREDENTIALS_JWT_CLAIMS__CLAIM_NAME_

Map<String,String>

 

quarkus.oidc-client.credentials.jwt.signature-algorithm

quarkus.oidc-client."id".credentials.jwt.signature-algorithm

key-file プロパティーに使用される署名アルゴリズム。サポートされる値: RS256 (デフォルト)、RS384RS512PS256PS384PS512ES256ES384ES512HS256HS384HS512

環境変数: QUARKUS_OIDC_CLIENT_CREDENTIALS_JWT_SIGNATURE_ALGORITHM

string

 

quarkus.oidc-client.credentials.jwt.lifespan

quarkus.oidc-client."id".credentials.jwt.lifespan

JWT の有効期間 (秒単位)。この値は、JWT が発行された時刻に追加され、有効期限を計算します。

環境変数: QUARKUS_OIDC_CLIENT_CREDENTIALS_JWT_LIFESPAN

int

10

quarkus.oidc-client.credentials.jwt.assertion

quarkus.oidc-client."id".credentials.jwt.assertion

true の場合、クライアント認証トークンは JWT ベアラーグラントアサーションです。'client_assertion' および 'client_assertion_type' フォームプロパティーを生成する代わりに、'assertion' のみが生成されます。このオプションは、OIDC クライアントエクステンションでのみサポートされます。

環境変数: QUARKUS_OIDC_CLIENT_CREDENTIALS_JWT_ASSERTION

boolean

false

duration のフォーマット

duration の値を書き込むには、標準の java.time.Duration フォーマットを使用します。詳細は、Duration#parse() Java API ドキュメント を参照してください。

数字で始まる簡略化されたフォーマットも使用できます。

  • 値が数値のみの場合は、秒単位の時間を表します。
  • 数字の後に ms が続く値は、ミリ秒単位の時間を表します。

その他の場合は、解析のために簡略化されたフォーマットが java.time.Duration フォーマットに変換されます。

  • 数字の後に hm、または s が続く値には、接頭辞 PT が付きます。
  • 数字の後に d が続く値は、接頭辞 P が付きます。

1.6.2. OIDC トークンの伝播

🔒 ビルド時に固定: 設定プロパティーはビルド時に固定されます。他のすべての設定プロパティーは実行時にオーバーライドできます。

Expand

設定プロパティー

デフォルト

🔒 ビルド時に固定 quarkus.rest-client-oidc-token-propagation.enabled

OIDC トークンリアクティブプロパゲーションを有効にするかどうか。

環境変数: QUARKUS_REST_CLIENT_OIDC_TOKEN_PROPAGATION_ENABLED

boolean

true

🔒 ビルド時に固定 quarkus.rest-client-oidc-token-propagation.enabled-during-authentication

SecurityIdentity のオーグメンテーション中にトークンの伝播を有効にするかどうか。

たとえば、SecurityIdentity の追加ロールを取得するには、SecurityIdentityAugmentor の REST クライアントを使用して現在のトークンを伝播する必要がある場合があります。

この機能は複製されたコンテキストに依存することに注意してください。Vert.x の複製されたコンテキストの詳細は、こちらのガイド を参照してください。

環境変数: QUARKUS_REST_CLIENT_OIDC_TOKEN_PROPAGATION_ENABLED_DURING_AUTHENTICATION

boolean

false

🔒 ビルド時に固定 quarkus.rest-client-oidc-token-propagation.exchange-token

トークンを伝播する前に、"urn:ietf:params:oauth:grant-type:token-exchange" または "urn:ietf:params:oauth:grant-type:jwt-bearer" トークングラントのいずれかを使用して、OpenId Connect プロバイダーで現在のトークンを新しいトークンと交換します。

環境変数: QUARKUS_REST_CLIENT_OIDC_TOKEN_PROPAGATION_EXCHANGE_TOKEN

boolean

false

🔒 ビルド時に固定 quarkus.rest-client-oidc-token-propagation.client-name

設定された OidcClient の名前。このプロパティーは、exchangeToken プロパティーが有効な場合にのみ使用されることに注意してください。

環境変数: QUARKUS_REST_CLIENT_OIDC_TOKEN_PROPAGATION_CLIENT_NAME

string

 

1.7. 参考資料

第2章 OpenID Connect クライアントとトークンの伝播クイックスタート

フィルター付きの OpenID Connect (OIDC) および OAuth2 クライアントを使用して、アプリケーションでアクセストークンを取得、更新、および伝播する方法を学習します。

Quarkus での OIDC ClientToken Propagation のサポートの詳細は、OpenID Connect (OIDC) と OAuth2 クライアントおよびフィルターのリファレンスガイド を参照してください。

ベアラートークン認可を使用してアプリケーションを保護するには、OpenID Connect (OIDC) ベアラートークン認証 ガイドを参照してください。

2.1. 前提条件

このガイドを完了するには、以下が必要です。

  • 約 15 分
  • IDE
  • JAVA_HOME が適切に設定された状態でインストールされた JDK 17 以降
  • Apache Maven 3.8.6 以降
  • 動作するコンテナーランタイム (Docker または Podman)
  • オプション: Quarkus CLI (使用する場合)
  • オプション: ネイティブ実行可能ファイルをビルドする場合は、インストールおよび 適切に設定された Mandrel または GraalVM (ネイティブコンテナービルドを使用する場合は Docker)。
  • jq tool

2.2. アーキテクチャー

この例では、FrontendResourceProtectedResource という 2 つの Jakarta REST リソースを使用してアプリケーションがビルドされます。ここで、FrontendResource は、以下に示す 3 つの方法のいずれかを使用してアクセストークンを ProtectedResource に伝播します。

  • トークンを伝播する前に、OIDC クライアントフィルターを使用してトークンを取得できます。
  • プログラムで作成された OIDC クライアントを使用してトークンを取得し、それを HTTP Authorization ヘッダー値として REST クライアントメソッドに渡すことで伝播できます。
  • OIDC トークン伝播フィルターを使用して、受信したアクセストークンを伝播できます。

FrontendResource には 8 つのエンドポイントがあります。

  • /frontend/user-name-with-oidc-client-token
  • /frontend/admin-name-with-oidc-client-token
  • /frontend/user-name-with-oidc-client-token-header-param
  • /frontend/admin-name-with-oidc-client-token-header-param
  • /frontend/user-name-with-oidc-client-token-header-param-blocking
  • /frontend/admin-name-with-oidc-client-token-header-param-blocking
  • /frontend/user-name-with-propagated-token
  • /frontend/admin-name-with-propagated-token

/frontend/user-name-with-oidc-client-token または /frontend/admin-name-with-oidc-client-token エンドポイントのいずれかが呼び出されると、FrontendResource は REST クライアントと OIDC クライアントフィルターを使用してアクセストークンを取得し、ProtectedResource に伝播します。/frontend/user-name-with-oidc-client-token-header-param または /frontend/admin-name-with-oidc-client-token-header-param エンドポイントのいずれかが呼び出されると、FrontendResource はプログラムで作成された OIDC クライアントを使用してアクセストークンを取得し、それを HTTP Authorization ヘッダー値として REST クライアントメソッドに渡すことで ProtectedResource に伝播します。/frontend/user-name-with-propagated-token または /frontend/admin-name-with-propagated-token エンドポイントのいずれかが呼び出されると、FrontendResource は REST クライアントと OIDC Token Propagation Filter を使用して、現在の受信アクセストークンを ProtectedResource に伝播します。

ProtectedResource には 2 つのエンドポイントがあります。

  • /protected/user-name
  • /protected/admin-name

両方のエンドポイントは、FrontendResource から ProtectedResource に伝播された受信アクセストークンから抽出されたユーザー名を返します。これらのエンドポイントの唯一の違いは、/protected/user-name の呼び出しは現在のアクセストークンに user ロールがある場合にのみ許可され、/protected/admin-name の呼び出しは現在のアクセストークンに admin ロールがある場合にのみ許可されることです。

2.3. ソリューション

次のセクションの指示に従って、アプリケーションを段階的に作成することを推奨します。ただし、完成した例に直接進むこともできます。

Git リポジトリーのクローンを作成するか (git clone https://github.com/quarkusio/quarkus-quickstarts.git -b 3.20)、アーカイブ をダウンロードしてください。

ソリューションは、security-openid-connect-client-quickstart ディレクトリー にあります。

2.4. Maven プロジェクトの作成

まず、新しいプロジェクトが必要です。次のコマンドで新しいプロジェクトを作成します。

  • Quarkus CLI を使用する場合:

    quarkus create app org.acme:security-openid-connect-client-quickstart \
        --extension='oidc,rest-client-oidc-filter,rest-client-oidc-token-propagation,rest' \
        --no-code
    cd security-openid-connect-client-quickstart
    Copy to Clipboard Toggle word wrap

    Gradle プロジェクトを作成するには、--gradle オプションまたは --gradle-kotlin-dsl オプションを追加します。

    Quarkus CLI のインストール方法と使用方法の詳細は、Quarkus CLI ガイドを参照してください。

  • Maven を使用する場合:

    mvn com.redhat.quarkus.platform:quarkus-maven-plugin:3.20.1:create \
        -DprojectGroupId=org.acme \
        -DprojectArtifactId=security-openid-connect-client-quickstart \
        -Dextensions='oidc,rest-client-oidc-filter,rest-client-oidc-token-propagation,rest' \
        -DnoCode
    cd security-openid-connect-client-quickstart
    Copy to Clipboard Toggle word wrap

    Gradle プロジェクトを作成するには、-DbuildTool=gradle または -DbuildTool=gradle-kotlin-dsl オプションを追加します。

Windows ユーザーの場合:

  • cmd を使用する場合は、バックスラッシュ \ を使用せず、すべてを同じ行に記述してください。
  • Powershell を使用する場合は、-D パラメーターを二重引用符で囲みます (例: "-DprojectArtifactId=security-openid-connect-client-quickstart")。

Maven プロジェクトが生成され、oidcrest-client-oidc-filterrest-client-oidc-token-propagation、および rest エクステンションがインポートされます。

Quarkus プロジェクトがすでに設定されている場合は、プロジェクトベースディレクトリーで次のコマンドを実行して、これらのエクステンションをプロジェクトに追加できます。

  • Quarkus CLI を使用する場合:

    quarkus extension add oidc,rest-client-oidc-filter,rest-client-oidc-token-propagation,rest
    Copy to Clipboard Toggle word wrap
  • Maven を使用する場合:

    ./mvnw quarkus:add-extension -Dextensions='oidc,rest-client-oidc-filter,rest-client-oidc-token-propagation,rest'
    Copy to Clipboard Toggle word wrap
  • Gradle を使用する場合:

    ./gradlew addExtension --extensions='oidc,rest-client-oidc-filter,rest-client-oidc-token-propagation,rest'
    Copy to Clipboard Toggle word wrap

ビルドファイルに次のエクステンションが追加されます。

  • Maven を使用する場合:

    <dependency>
        <groupId>io.quarkus</groupId>
        <artifactId>quarkus-oidc</artifactId>
    </dependency>
    <dependency>
        <groupId>io.quarkus</groupId>
        <artifactId>quarkus-rest-client-oidc-filter</artifactId>
    </dependency>
    <dependency>
        <groupId>io.quarkus</groupId>
        <artifactId>quarkus-rest-client-oidc-token-propagation</artifactId>
    </dependency>
    <dependency>
        <groupId>io.quarkus</groupId>
        <artifactId>quarkus-rest</artifactId>
    </dependency>
    Copy to Clipboard Toggle word wrap
  • Gradle を使用する場合:

    implementation("io.quarkus:quarkus-oidc,rest-client-oidc-filter,rest-client-oidc-token-propagation,rest")
    Copy to Clipboard Toggle word wrap

2.5. アプリケーションの作成

まず、ProtectedResource を実装します。

package org.acme.security.openid.connect.client;

import jakarta.annotation.security.RolesAllowed;
import jakarta.inject.Inject;
import jakarta.ws.rs.GET;
import jakarta.ws.rs.Path;
import jakarta.ws.rs.Produces;

import io.quarkus.security.Authenticated;
import io.smallrye.mutiny.Uni;

import org.eclipse.microprofile.jwt.JsonWebToken;

@Path("/protected")
@Authenticated
public class ProtectedResource {

    @Inject
    JsonWebToken principal;

    @GET
    @RolesAllowed("user")
    @Produces("text/plain")
    @Path("userName")
    public Uni<String> userName() {
        return Uni.createFrom().item(principal.getName());
    }

    @GET
    @RolesAllowed("admin")
    @Produces("text/plain")
    @Path("adminName")
    public Uni<String> adminName() {
        return Uni.createFrom().item(principal.getName());
    }
}
Copy to Clipboard Toggle word wrap

ProtectedResource は、userName() メソッドと adminName() メソッドの両方から名前を返します。名前は現在の JsonWebToken から展開されます。

次に、以下の REST クライアントを追加します。

  1. RestClientWithOidcClientFilter: これは、quarkus-rest-client-oidc-filter エクステンションによって提供される OIDC クライアントフィルターを使用して、アクセストークンを取得および伝播します。
  2. RestClientWithTokenHeaderParam: これは、プログラムで作成された OidcClient によってすでに取得されたトークンを HTTP Authorization ヘッダー値として受け入れます。
  3. RestClientWithTokenPropagationFilter: これは、quarkus-rest-client-oidc-token-propagation エクステンションによって提供される OIDC トークン伝播フィルターを使用して、アクセストークンを取得および伝播します。

RestClientWithOidcClientFilter REST クライアントを追加します。

package org.acme.security.openid.connect.client;

import jakarta.ws.rs.GET;
import jakarta.ws.rs.Path;
import jakarta.ws.rs.Produces;

import org.eclipse.microprofile.rest.client.inject.RegisterRestClient;

import io.quarkus.oidc.client.filter.OidcClientFilter;
import io.smallrye.mutiny.Uni;

@RegisterRestClient
@OidcClientFilter 
1

@Path("/")
public interface RestClientWithOidcClientFilter {

    @GET
    @Produces("text/plain")
    @Path("userName")
    Uni<String> getUserName();

    @GET
    @Produces("text/plain")
    @Path("adminName")
    Uni<String> getAdminName();
}
Copy to Clipboard Toggle word wrap
1
REST クライアントに OIDC クライアントフィルターを登録して、トークンを取得および伝播します。

RestClientWithTokenHeaderParam REST クライアントを追加します。

package org.acme.security.openid.connect.client;

import org.eclipse.microprofile.rest.client.inject.RegisterRestClient;

import io.smallrye.mutiny.Uni;
import jakarta.ws.rs.GET;
import jakarta.ws.rs.HeaderParam;
import jakarta.ws.rs.Path;
import jakarta.ws.rs.Produces;

@RegisterRestClient
@Path("/")
public interface RestClientWithTokenHeaderParam {

    @GET
    @Produces("text/plain")
    @Path("userName")
    Uni<String> getUserName(@HeaderParam("Authorization") String authorization); 
1


    @GET
    @Produces("text/plain")
    @Path("adminName")
    Uni<String> getAdminName(@HeaderParam("Authorization") String authorization); 
2

}
Copy to Clipboard Toggle word wrap
1 2
RestClientWithTokenHeaderParam REST クライアントは、トークンが HTTP Authorization ヘッダー値として渡されることを要求します。

RestClientWithTokenPropagationFilter REST クライアントを追加します。

package org.acme.security.openid.connect.client;

import jakarta.ws.rs.GET;
import jakarta.ws.rs.Path;
import jakarta.ws.rs.Produces;

import org.eclipse.microprofile.rest.client.inject.RegisterRestClient;

import io.quarkus.oidc.token.propagation.common.AccessToken;

import io.smallrye.mutiny.Uni;

@RegisterRestClient
@AccessToken 
1

@Path("/")
public interface RestClientWithTokenPropagationFilter {

    @GET
    @Produces("text/plain")
    @Path("userName")
    Uni<String> getUserName();

    @GET
    @Produces("text/plain")
    @Path("adminName")
    Uni<String> getAdminName();
}
Copy to Clipboard Toggle word wrap
1
REST クライアントに OIDC トークン伝播フィルターを登録して、既存の受信トークンを伝播します。
重要

RestClientWithOidcClientFilter インターフェイスと RestClientWithTokenPropagationFilter インターフェイスを同じ REST クライアントで使用しないでください。競合が発生し、問題が発生する可能性があります。たとえば、OIDC クライアントフィルターが、OIDC トークン伝播フィルターからのトークンをオーバーライドすることがあります。また、利用可能なトークンがない場合に伝播フィルターがトークンを伝播しようとしても、代わりに OIDC クライアントフィルターに新しいトークンを取得するよう要求して、伝播フィルターが正しく機能しない可能性があります。

また、起動時にプログラムで OIDC クライアントを作成するには、OidcClientCreator を追加します。OidcClientCreatorRestClientWithTokenHeaderParam REST クライアント呼び出しをサポートしています。

package org.acme.security.openid.connect.client;

import java.util.Map;

import org.eclipse.microprofile.config.inject.ConfigProperty;

import io.quarkus.oidc.client.OidcClient;
import io.quarkus.oidc.client.OidcClients;
import io.quarkus.oidc.client.runtime.OidcClientConfig;
import io.quarkus.oidc.client.runtime.OidcClientConfig.Grant.Type;
import io.quarkus.runtime.StartupEvent;
import io.smallrye.mutiny.Uni;
import jakarta.enterprise.context.ApplicationScoped;
import jakarta.enterprise.event.Observes;
import jakarta.inject.Inject;

@ApplicationScoped
public class OidcClientCreator {

    @Inject
    OidcClients oidcClients; 
1

    @ConfigProperty(name = "quarkus.oidc.auth-server-url")
    String oidcProviderAddress;

    private volatile OidcClient oidcClient;

    public void startup(@Observes StartupEvent event) {
    	createOidcClient().subscribe().with(client -> {oidcClient = client;});
    }

    public OidcClient getOidcClient() {
        return oidcClient;
    }

    private Uni<OidcClient> createOidcClient() {
        OidcClientConfig cfg = OidcClientConfig
            .authServerUrl(oidcProviderAddress)
            .id("myclient")
            .clientId("backend-service")
            .credentials("secret")
            .grant(Type.PASSWORD)
            .grantOptions("password", Map.of("username", "alice", "password", "alice"))
            .build();
        return oidcClients.newClient(cfg);
    }
}
Copy to Clipboard Toggle word wrap
1
OidcClients を使用して、すでに初期化され、名前が付けられた OIDC クライアントを取得できるほか、必要に応じて新しい OIDC クライアントを作成できます。

次に、FrontendResource を追加してアプリケーションの作成を完了します。

package org.acme.security.openid.connect.client;

import jakarta.inject.Inject;
import jakarta.ws.rs.GET;
import jakarta.ws.rs.Path;
import jakarta.ws.rs.Produces;

import io.quarkus.oidc.client.Tokens;
import io.quarkus.oidc.client.runtime.TokensHelper;

import org.eclipse.microprofile.rest.client.inject.RestClient;

import io.smallrye.mutiny.Uni;

@Path("/frontend")
public class FrontendResource {
    @Inject
    @RestClient
    RestClientWithOidcClientFilter restClientWithOidcClientFilter; 
1


    @Inject
    @RestClient
    RestClientWithTokenPropagationFilter restClientWithTokenPropagationFilter; 
2


    @Inject
    OidcClientCreator oidcClientCreator;
    TokensHelper tokenHelper = new TokensHelper(); 
3

    @Inject
    @RestClient
    RestClientWithTokenHeaderParam restClientWithTokenHeaderParam; 
4


    @GET
    @Path("user-name-with-oidc-client-token")
    @Produces("text/plain")
    public Uni<String> getUserNameWithOidcClientToken() { 
5

        return restClientWithOidcClientFilter.getUserName();
    }

    @GET
    @Path("admin-name-with-oidc-client-token")
    @Produces("text/plain")
    public Uni<String> getAdminNameWithOidcClientToken() { 
6

	return restClientWithOidcClientFilter.getAdminName();
    }

    @GET
    @Path("user-name-with-propagated-token")
    @Produces("text/plain")
    public Uni<String> getUserNameWithPropagatedToken() { 
7

        return restClientWithTokenPropagationFilter.getUserName();
    }

    @GET
    @Path("admin-name-with-propagated-token")
    @Produces("text/plain")
    public Uni<String> getAdminNameWithPropagatedToken() { 
8

        return restClientWithTokenPropagationFilter.getAdminName();
    }

    @GET
    @Path("user-name-with-oidc-client-token-header-param")
    @Produces("text/plain")
    public Uni<String> getUserNameWithOidcClientTokenHeaderParam() { 
9

    	return tokenHelper.getTokens(oidcClientCreator.getOidcClient()).onItem()
        		.transformToUni(tokens -> restClientWithTokenHeaderParam.getUserName("Bearer " + tokens.getAccessToken()));
    }

    @GET
    @Path("admin-name-with-oidc-client-token-header-param")
    @Produces("text/plain")
    public Uni<String> getAdminNameWithOidcClientTokenHeaderParam() { 
10

    	return tokenHelper.getTokens(oidcClientCreator.getOidcClient()).onItem()
        		.transformToUni(tokens -> restClientWithTokenHeaderParam.getAdminName("Bearer " + tokens.getAccessToken()));
    }

    @GET
    @Path("user-name-with-oidc-client-token-header-param-blocking")
    @Produces("text/plain")
    public String getUserNameWithOidcClientTokenHeaderParamBlocking() { 
11

    	Tokens tokens = tokenHelper.getTokens(oidcClientCreator.getOidcClient()).await().indefinitely();
        return restClientWithTokenHeaderParam.getUserName("Bearer " + tokens.getAccessToken()).await().indefinitely();
    }

    @GET
    @Path("admin-name-with-oidc-client-token-header-param-blocking")
    @Produces("text/plain")
    public String getAdminNameWithOidcClientTokenHeaderParamBlocking() { 
12

    	Tokens tokens = tokenHelper.getTokens(oidcClientCreator.getOidcClient()).await().indefinitely();
        return restClientWithTokenHeaderParam.getAdminName("Bearer " + tokens.getAccessToken()).await().indefinitely();
    }

}
Copy to Clipboard Toggle word wrap
1 5 6
FrontendResource は、/frontend/user-name-with-oidc-client-token または /frontend/admin-name-with-oidc-client-token のいずれかが呼び出されたときに、注入された RestClientWithOidcClientFilter REST クライアントと OIDC クライアントフィルターを使用し、アクセストークンを取得して ProtectedResource に伝播します。
2 7 8
FrontendResource は、/frontend/user-name-with-propagated-token または /frontend/admin-name-with-propagated-token のいずれかが呼び出されたときに、注入された RestClientWithTokenPropagationFilter REST クライアントと OIDC トークン伝播フィルターを使用して、現在の受信アクセストークンを ProtectedResource に伝播します。
4 9 10
FrontendResource は、/frontend/user-name-with-oidc-client-token-header-param または /frontend/admin-name-with-oidc-client-token-header-param のいずれかが呼び出されたときに、プログラムで作成された OIDC クライアントを使用してアクセストークンを取得し、注入された RestClientWithTokenHeaderParam REST クライアントのメソッドに HTTP Authorization ヘッダー値として直接アクセストークンを渡すことで ProtectedResource に伝播します。
11 12
場合によっては、REST クライアントでトークンを伝播する前に、ブロッキング方式でトークンを取得する必要があることがあります。この例では、そのような場合にトークンを取得する方法を示しています。
3
io.quarkus.oidc.client.runtime.TokensHelper は、OIDC クライアントフィルターを使用せずに OIDC クライアントを直接使用する場合に便利なツールです。TokensHelper を使用するには、OIDC クライアントを渡してトークンを取得します。TokensHelper は、トークンを取得し、必要に応じてスレッドセーフな方法でトークンを更新します。

最後に、Jakarta REST ExceptionMapper を追加します。

package org.acme.security.openid.connect.client;

import jakarta.ws.rs.core.Response;
import jakarta.ws.rs.ext.ExceptionMapper;
import jakarta.ws.rs.ext.Provider;

import org.jboss.resteasy.reactive.ClientWebApplicationException;

@Provider
public class FrontendExceptionMapper implements ExceptionMapper<ClientWebApplicationException> {

	@Override
	public Response toResponse(ClientWebApplicationException t) {
		return Response.status(t.getResponse().getStatus()).build();
	}

}
Copy to Clipboard Toggle word wrap

この例外マッパーは、トークンに予期されるロールがない場合に ProtectedResource403 を返すことをテスト中に検証するためにのみ追加されます。このマッパーがない場合、Quarkus REST (旧称 RESTEasy Reactive) は、REST クライアント呼び出しから逃れた例外を 500 に正しく変換し、ProtectedResource など、ダウンストリームリソースからの情報の漏洩を回避します。ただし、テストでは、500 が何らかの内部エラーではなく、認可例外によって発生したと断言することはできません。

2.6. アプリケーションの設定

コードを準備したら、アプリケーションを設定します。

# Configure OIDC

%prod.quarkus.oidc.auth-server-url=http://localhost:8180/realms/quarkus
quarkus.oidc.client-id=backend-service
quarkus.oidc.credentials.secret=secret

# Tell Dev Services for Keycloak to import the realm file
# This property is ineffective when running the application in JVM or Native modes but only in dev and test modes.

quarkus.keycloak.devservices.realm-path=quarkus-realm.json

# Configure OIDC Client

quarkus.oidc-client.auth-server-url=${quarkus.oidc.auth-server-url}
quarkus.oidc-client.client-id=${quarkus.oidc.client-id}
quarkus.oidc-client.credentials.secret=${quarkus.oidc.credentials.secret}
quarkus.oidc-client.grant.type=password
quarkus.oidc-client.grant-options.password.username=alice
quarkus.oidc-client.grant-options.password.password=alice

# Configure REST clients

%prod.port=8080
%dev.port=8080
%test.port=8081

org.acme.security.openid.connect.client.RestClientWithOidcClientFilter/mp-rest/url=http://localhost:${port}/protected
org.acme.security.openid.connect.client.RestClientWithTokenHeaderParam/mp-rest/url=http://localhost:${port}/protected
org.acme.security.openid.connect.client.RestClientWithTokenPropagationFilter/mp-rest/url=http://localhost:${port}/protected
Copy to Clipboard Toggle word wrap

上記の設定は Keycloak を参照します。Keycloak は、ProtectedResource によって受信アクセストークンを検証するために使用され、OidcClient によって password グラントを使用してユーザー alice のトークンを取得するために使用されます。両方の REST クライアントは ProtectedResource の HTTP アドレスを参照します。

注記

quarkus.oidc.auth-server-url%prod. プロファイル接頭辞を追加すると、アプリケーションが開発モードまたはテストモードで実行されるときに、Dev Services for Keycloak によってコンテナーが起動されるようになります。詳細は、開発モードでのアプリケーションの実行 セクションを参照してください。

2.7. Keycloak サーバーの起動と設定

注記

アプリケーションを開発モードまたはテストモードで実行するときは、Keycloak サーバーを起動しないでください。Dev Services for Keycloak がコンテナーを起動します。詳細は、開発モードでのアプリケーションの実行 セクションを参照してください。レルム設定ファイルtarget/classes ディレクトリーのクラスパスに配置するようにしてください。この配置により、ファイルが開発モードで自動的にインポートされるようになります。ただし、すでに 完全なソリューション をビルドしている場合は、レルムファイルをクラスパスに追加する必要はありません。ビルドプロセスですでに追加されているためです。

Docker を使用して次のコマンドを実行するだけで、Keycloak サーバーを起動できます。

docker run --name keycloak -e KC_BOOTSTRAP_ADMIN_USERNAME=admin -e KC_BOOTSTRAP_ADMIN_PASSWORD=admin -p 8180:8080 quay.io/keycloak/keycloak:{keycloak.version} start-dev
Copy to Clipboard Toggle word wrap

{keycloak.version}26.1.3 以降に設定します。

Keycloak サーバーには localhost:8180 からアクセスできます。

Keycloak 管理コンソールにアクセスするには、admin ユーザーとしてログインします。パスワードは admin です。

新しいレルムを作成するには、レルム設定ファイル をインポートします。詳細は、新しいレルムを作成する 方法に関する Keycloak のドキュメントを参照してください。

この quarkus レルムファイルは、frontend クライアントと、alice および admin ユーザーを追加します。alice には user ロールがあります。admin には useradmin の両方のロールがあります。

2.8. 開発モードでのアプリケーションの実行

開発モードでアプリケーションを実行するには、次を使用します。

  • Quarkus CLI を使用する場合:

    quarkus dev
    Copy to Clipboard Toggle word wrap
  • Maven を使用する場合:

    ./mvnw quarkus:dev
    Copy to Clipboard Toggle word wrap
  • Gradle を使用する場合:

    ./gradlew --console=plain quarkusDev
    Copy to Clipboard Toggle word wrap

Dev Services for Keycloak が Keycloak コンテナーを起動し、quarkus-realm.json をインポートします。

/q/dev-ui で利用可能な Dev UI を開き、OpenID Connect Dev UI カードの Keycloak provider リンクをクリックします。

求められたら、OpenID Connect Dev UI によって提供される Single Page Application にログインします。

  • パスワード admin を使用して、admin としてログインします。このユーザーには adminuser の両方のロールがあります。

    • /frontend/user-name-with-propagated-token にアクセスすると、200 が返されます。
    • /frontend/admin-name-with-propagated-token にアクセスすると、200 が返されます。
  • ログアウトし、パスワード alice を使用して alice として再度ログインします。このユーザーには user ロールがあります。

    • /frontend/user-name-with-propagated-token にアクセスすると、200 が返されます。
    • /frontend/admin-name-with-propagated-token にアクセスすると、403 が返されます。

これで、FrontendResource が OpenID Connect Dev UI からアクセストークンを伝播できることをテストできました。

2.9. JVM モードでのアプリケーションの実行

開発モードでアプリケーションを試した後、標準の Java アプリケーションとして実行できます。

まず、コンパイルします。

  • Quarkus CLI を使用する場合:

    quarkus build
    Copy to Clipboard Toggle word wrap
  • Maven を使用する場合:

    ./mvnw install
    Copy to Clipboard Toggle word wrap
  • Gradle を使用する場合:

    ./gradlew build
    Copy to Clipboard Toggle word wrap

次に、実行します。

java -jar target/quarkus-app/quarkus-run.jar
Copy to Clipboard Toggle word wrap

2.10. ネイティブモードでアプリケーションの実行

このデモはネイティブコードにコンパイルできます。変更は必要ありません。

これは、生成されたバイナリーにランタイムテクノロジーが含まれ、最小限のリソースで実行するように最適化されているため、実稼働環境に JVM をインストールする必要がなくなることを意味します。

コンパイルには時間がかかるため、この手順はデフォルトでオフになっています。再度ビルドするには、native プロファイルを有効にします。

  • Quarkus CLI を使用する場合:

    quarkus build --native
    Copy to Clipboard Toggle word wrap
  • Maven を使用する場合:

    ./mvnw install -Dnative
    Copy to Clipboard Toggle word wrap
  • Gradle を使用する場合:

    ./gradlew build -Dquarkus.native.enabled=true
    Copy to Clipboard Toggle word wrap

しばらくしてビルドが完了すると、ネイティブバイナリーを直接実行できます。

./target/security-openid-connect-quickstart-1.0.0-SNAPSHOT-runner
Copy to Clipboard Toggle word wrap

2.11. アプリケーションのテスト

開発モードでアプリケーションをテストする方法の詳細は、前述の 開発モードでのアプリケーションの実行 セクションを参照してください。

curl を使用して、JVM モードまたはネイティブモードで起動されたアプリケーションをテストできます。

alice のアクセストークンを取得します。

export access_token=$(\
    curl --insecure -X POST http://localhost:8180/realms/quarkus/protocol/openid-connect/token \
    --user backend-service:secret \
    -H 'content-type: application/x-www-form-urlencoded' \
    -d 'username=alice&password=alice&grant_type=password' | jq --raw-output '.access_token' \
 )
Copy to Clipboard Toggle word wrap

このトークンを使用して、/frontend/user-name-with-propagated-token を呼び出します。このコマンドは、ステータスコード 200 と名前 alice を返します。

curl -i -X GET \
  http://localhost:8080/frontend/user-name-with-propagated-token \
  -H "Authorization: Bearer "$access_token
Copy to Clipboard Toggle word wrap

同じトークンを使用して、/frontend/admin-name-with-propagated-token を呼び出します。前のコマンドとは対照的に、このコマンドは 403 を返します。alice に付与されているのは user ロールだけであるためです。

curl -i -X GET \
  http://localhost:8080/frontend/admin-name-with-propagated-token \
  -H "Authorization: Bearer "$access_token
Copy to Clipboard Toggle word wrap

次に、admin のアクセストークンを取得します。

export access_token=$(\
    curl --insecure -X POST http://localhost:8180/realms/quarkus/protocol/openid-connect/token \
    --user backend-service:secret \
    -H 'content-type: application/x-www-form-urlencoded' \
    -d 'username=admin&password=admin&grant_type=password' | jq --raw-output '.access_token' \
 )
Copy to Clipboard Toggle word wrap

このトークンを使用して、/frontend/user-name-with-propagated-token を呼び出します。このコマンドは、ステータスコード 200 と名前 admin を返します。

curl -i -X GET \
  http://localhost:8080/frontend/user-name-with-propagated-token \
  -H "Authorization: Bearer "$access_token
Copy to Clipboard Toggle word wrap

同じトークンを使用して、/frontend/admin-name-with-propagated-token を呼び出します。admin には useradmin の両方のロールがあるため、このコマンドも 200 ステータスコードと名前 admin を返します。

curl -i -X GET \
  http://localhost:8080/frontend/admin-name-with-propagated-token \
  -H "Authorization: Bearer "$access_token
Copy to Clipboard Toggle word wrap

次に、既存のトークンを伝播せず、OidcClient を使用してトークンを取得および伝播する FrontendResource メソッドを確認します。すでに示したように、OidcClient はユーザー alice のトークンを取得するように設定されています。

curl -i -X GET \
  http://localhost:8080/frontend/user-name-with-oidc-client-token
Copy to Clipboard Toggle word wrap

このコマンドは、ステータスコード 200 と名前 alice を返します。

curl -i -X GET \
  http://localhost:8080/frontend/admin-name-with-oidc-client-token
Copy to Clipboard Toggle word wrap

前のコマンドとは対照的に、このコマンドは 403 ステータスコードを返します。

次に、プログラムで作成された OIDC クライアントが、リアクティブモードと命令型 (ブロッキング) モードの両方で、RestClientWithTokenHeaderParam を使用してトークンを正しく取得して伝播することをテストします。

/user-name-with-oidc-client-token-header-param を呼び出します。このコマンドは、ステータスコード 200 と名前 alice を返します。

curl -i -X GET \
  http://localhost:8080/frontend/user-name-with-oidc-client-token-header-param
Copy to Clipboard Toggle word wrap

/admin-name-with-oidc-client-token-header-param を呼び出します。前のコマンドとは対照的に、このコマンドは 403 ステータスコードを返します。

curl -i -X GET \
  http://localhost:8080/frontend/admin-name-with-oidc-client-token-header-param
Copy to Clipboard Toggle word wrap

次に、ブロッキングモードで OIDC クライアントを使用するエンドポイントをテストします。

/user-name-with-oidc-client-token-header-param-blocking を呼び出します。このコマンドは、ステータスコード 200 と名前 alice を返します。

curl -i -X GET \
  http://localhost:8080/frontend/user-name-with-oidc-client-token-header-param-blocking
Copy to Clipboard Toggle word wrap

/admin-name-with-oidc-client-token-header-param-blocking を呼び出します。前のコマンドとは対照的に、このコマンドは 403 ステータスコードを返します。

curl -i -X GET \
  http://localhost:8080/frontend/admin-name-with-oidc-client-token-header-param-blocking
Copy to Clipboard Toggle word wrap

2.12. 参考資料

法律上の通知

Copyright © 2025 Red Hat, Inc.
The text of and illustrations in this document are licensed by Red Hat under a Creative Commons Attribution–Share Alike 3.0 Unported license ("CC-BY-SA"). An explanation of CC-BY-SA is available at http://creativecommons.org/licenses/by-sa/3.0/. In accordance with CC-BY-SA, if you distribute this document or an adaptation of it, you must provide the URL for the original version.
Red Hat, as the licensor of this document, waives the right to enforce, and agrees not to assert, Section 4d of CC-BY-SA to the fullest extent permitted by applicable law.
Red Hat, Red Hat Enterprise Linux, the Shadowman logo, the Red Hat logo, JBoss, OpenShift, Fedora, the Infinity logo, and RHCE are trademarks of Red Hat, Inc., registered in the United States and other countries.
Linux® is the registered trademark of Linus Torvalds in the United States and other countries.
Java® is a registered trademark of Oracle and/or its affiliates.
XFS® is a trademark of Silicon Graphics International Corp. or its subsidiaries in the United States and/or other countries.
MySQL® is a registered trademark of MySQL AB in the United States, the European Union and other countries.
Node.js® is an official trademark of Joyent. Red Hat is not formally related to or endorsed by the official Joyent Node.js open source or commercial project.
The OpenStack® Word Mark and OpenStack logo are either registered trademarks/service marks or trademarks/service marks of the OpenStack Foundation, in the United States and other countries and are used with the OpenStack Foundation's permission. We are not affiliated with, endorsed or sponsored by the OpenStack Foundation, or the OpenStack community.
All other trademarks are the property of their respective owners.
Red Hat logoGithubredditYoutubeTwitter

詳細情報

試用、購入および販売

コミュニティー

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

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

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

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

会社概要

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

Theme

© 2026 Red Hat
トップに戻る