3.5. 测试


当测试涉及向独立的 OIDC 服务器进行身份验证时,测试通常很复杂。Quarkus 提供多个选项,从模拟到 OIDC 供应商的本地运行。

首先,将以下依赖项添加到 test 项目中:

  • 使用 Maven:

    <dependency>
        <groupId>org.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("org.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:replaced-by-test-resource}/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 org.htmlunit.SilentCssErrorHandler;
import org.htmlunit.WebClient;
import org.htmlunit.html.HtmlForm;
import org.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().asNormalizedText());
        }
    }

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

OidcWiremockTestResource 可识别 aliceadmin 用户。用户 alice 默认具有用户角色 - 它可以通过 quarkus.test.oidc.token. user -roles 系统属性进行自定义。用户 admin 默认具有 用户和 admin 角色 - 它可以通过 quarkus.test.oidc.token.admin-roles 系统属性进行自定义。

另外,OidcWiremockTestResource 将令牌签发者和 audience 设置为 https://service.example.com,它可以通过 quarkus.test.oidc.token.issuerquarkus.test.oidc.token.audience 系统属性进行自定义。

OidcWiremockTestResource 可用于模拟所有 OIDC 供应商。

3.5.2. 用于 Keycloak 的 dev Services

建议对 Keycloak 使用 Dev Services 进行 集成测试。用于 Keycloak 的 dev Services 将启动并初始化测试容器:它将创建一个 quarkus 域、quarkus-app 客户端(secret secret),并添加 alice (admin user roles)和 bob (用户角色)用户,您可以在其中自定义所有这些属性。

首先,准备 application.properties。您可以从完全空的 application.properties 文件作为 Keycloak 的 Dev Services 开始,注册指向正在运行的测试容器的 quarkus.oidc.auth-server-url,以及 quarkus.oidc.client-id=quarkus-appquarkus.oidc.credentials.secret=secret

但是,如果您已经配置了所有必需的 quarkus-oidc 属性,则您只需要将 quarkus.oidc.auth-server-urlKeycloak 的 Dev Services 的 prod 配置集关联,才能启动容器。例如:

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

如果在运行测试前必须将自定义域文件导入到 Keycloak 中,您可以为 Keycloak 配置 Dev Services,如下所示:

%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 注释来测试 web-app 应用端点代码,这取决于以下注入之一,或者全部四个:

  • ID JsonWebToken
  • Access JsonWebToken
  • UserInfo
  • OidcConfigurationMetadata

有关更多信息,请参阅将 TestingSecurity 与注入的 JsonWebToken 搭配使用

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

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

© 2024 Red Hat, Inc.