検索

3.5. テスト

download PDF

別の OIDC のようなサーバーへの認証に関しては、テストが困難になることがよくあります。Quarkus は、モックから OIDC プロバイダーのローカル実行まで、さまざまなオプションを提供します。

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

  • Maven を使用:

    <dependency>
        <groupId>net.sourceforge.htmlunit</groupId>
        <artifactId>htmlunit</artifactId>
        <exclusions>
            <exclusion>
                <groupId>org.eclipse.jetty</groupId>
                <artifactId>*</artifactId>
           </exclusion>
        </exclusions>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>io.quarkus</groupId>
        <artifactId>quarkus-junit5</artifactId>
        <scope>test</scope>
    </dependency>
  • Gradle を使用する場合:

    testImplementation("net.sourceforge.htmlunit:htmlunit")
    testImplementation("io.quarkus:quarkus-junit5")

3.5.1. Wiremock

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

  • Maven を使用:

    <dependency>
        <groupId>io.quarkus</groupId>
        <artifactId>quarkus-test-oidc-server</artifactId>
        <scope>test</scope>
    </dependency>
  • Gradle を使用する場合:

    testImplementation("io.quarkus:quarkus-test-oidc-server")

REST テストエンドポイントを準備し、application.properties を設定します。以下に例を示します。

# keycloak.url is set by OidcWiremockTestResource
quarkus.oidc.auth-server-url=${keycloak.url}/realms/quarkus/
quarkus.oidc.client-id=quarkus-web-app
quarkus.oidc.credentials.secret=secret
quarkus.oidc.application-type=web-app

最後に、次のようなテストコードを記述します。

import static org.junit.jupiter.api.Assertions.assertEquals;

import org.junit.jupiter.api.Test;

import com.gargoylesoftware.htmlunit.SilentCssErrorHandler;
import com.gargoylesoftware.htmlunit.WebClient;
import com.gargoylesoftware.htmlunit.html.HtmlForm;
import com.gargoylesoftware.htmlunit.html.HtmlPage;

import io.quarkus.test.common.QuarkusTestResource;
import io.quarkus.test.junit.QuarkusTest;
import io.quarkus.test.oidc.server.OidcWiremockTestResource;

@QuarkusTest
@QuarkusTestResource(OidcWiremockTestResource.class)
public class CodeFlowAuthorizationTest {

    @Test
    public void testCodeFlow() throws Exception {
        try (final WebClient webClient = createWebClient()) {
            // the test REST endpoint listens on '/code-flow'
            HtmlPage page = webClient.getPage("http://localhost:8081/code-flow");

            HtmlForm form = page.getFormByName("form");
            // user 'alice' has the 'user' role
            form.getInputByName("username").type("alice");
            form.getInputByName("password").type("alice");

            page = form.getInputByValue("login").click();

            assertEquals("alice", page.getBody().asText());
        }
    }

    private WebClient createWebClient() {
        WebClient webClient = new WebClient();
        webClient.setCssErrorHandler(new SilentCssErrorHandler());
        return webClient;
    }
}

OidcWiremockTestResource は、alice および admin ユーザーを認識します。ユーザー alice には、デフォルトで user ロールのみが割り当てられます。これは、quarkus.test.oidc.token.user-roles システムプロパティーを使用してカスタマイズできます。ユーザー admin には、デフォルトで user ロールと admin ロールがあります。これは、quarkus.test.oidc.token.admin-roles システムプロパティーを使用してカスタマイズできます。

さらに、OidcWiremockTestResourceは、トークンの発行者と audience を https://service.example.com に設定します。これは、quarkus.test.oidc.token.issuer および quarkus.test.oidc.token.audience システムプロパティーを使用してカスタマイズできます。

OidcWiremockTestResource は、すべての OIDC プロバイダーをエミュレートするために使用できます。

3.5.2. Dev Services for Keycloak

Keycloak に対する結合テストには、Dev Services for Keycloak の使用が推奨されます。Dev Services for Keycloak がテストコンテナーを起動して初期化します。これにより、quarkus レルム、quarkus-app クライアント (secret シークレット) が作成され、alice (admin ロールと user ロール) および bob (user ロール) ユーザーが追加されます。これらのプロパティーはすべてカスタマイズできます。

まず、application.properties を準備します。完全に空の application.properties ファイルから開始できます。これは、Dev Services for Keycloak は、実行中のテストコンテナーを指す quarkus.oidc.auth-server-url および quarkus.oidc.client-id=quarkus-app および quarkus.oidc.credentials.secret=secret を登録します。

ただし、必要な quarkus-oidc プロパティーがすべてすでに設定されている場合は、コンテナーを起動するために、Dev Services for Keycloakprod プロファイルに quarkus.oidc.auth-server-url を関連付けるだけで済みます。以下に例を示します。

%prod.quarkus.oidc.auth-server-url=http://localhost:8180/realms/quarkus

テストを実行する前にカスタムレルムファイルを Keycloak にインポートする必要がある場合は、次のようにして Dev Services for Keycloak を設定できます。

%prod.quarkus.oidc.auth-server-url=http://localhost:8180/realms/quarkus
quarkus.keycloak.devservices.realm-path=quarkus-realm.json

最後に、Wiremock セクションで説明されているのと同じ方法でテストコードを記述します。唯一の違いは、@QuarkusTestResource が不要になったことです。

@QuarkusTest
public class CodeFlowAuthorizationTest {
}

3.5.3. TestSecurity アノテーション

@TestSecurity および @OidcSecurity アノテーションを使用して、次のインジェクションのいずれか、または 4 つすべてに依存する web-app アプリケーションエンドポイントコードをテストできます。

  • ID JsonWebToken
  • JsonWebToken へのアクセス
  • UserInfo
  • OidcConfigurationMetadata

詳細は、注入された JsonWebToken で TestingSecurity を使用する を参照してください。

3.5.4. ログエラーの確認

トークン検証エラーの詳細を確認するには、io.quarkus.oidc.runtime.OidcProvider TRACE レベルのロギングを有効にする必要があります。

quarkus.log.category."io.quarkus.oidc.runtime.OidcProvider".level=TRACE
quarkus.log.category."io.quarkus.oidc.runtime.OidcProvider".min-level=TRACE

OidcProvider クライアント初期化エラーの詳細を表示するには、io.quarkus.oidc.runtime.OidcRecorder TRACE レベルのロギングを有効にします。

quarkus.log.category."io.quarkus.oidc.runtime.OidcRecorder".level=TRACE
quarkus.log.category."io.quarkus.oidc.runtime.OidcRecorder".min-level=TRACE

quarkus dev コンソールから j と入力して、アプリケーションのグローバルログレベルを変更します。

Red Hat logoGithubRedditYoutubeTwitter

詳細情報

試用、購入および販売

コミュニティー

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

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

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

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

会社概要

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

© 2024 Red Hat, Inc.