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. 用于 Keycloak 的 dev Services
对于针对 Keycloak 的集成测试,使用 Keycloak 的 Dev 服务。此服务初始化测试容器,创建 quarkus
域,并使用 secret secret
配置 quarkus-app
客户端。它还设置两个用户: alice
(具有 admin
和 用户角色
)和 bob
( 用户角色
)。
首先,准备 application.properties
文件。
如果从空 application.properties
文件开始,则 Keycloak 的 Dev Services
会自动注册以下属性:
-
quarkus.oidc.auth-server-url
,它指向正在运行的测试容器。 -
quarkus.oidc.client-id=quarkus-app
. -
quarkus.oidc.credentials.secret=secret
.
如果您已经配置了所需的 quarkus-oidc
属性,请将 quarkus.oidc.auth-server-url
与 prod
配置集关联。这样可确保 Keycloak 的 Dev Services
会如预期启动容器。例如:
%prod.quarkus.oidc.auth-server-url=http://localhost:8180/realms/quarkus
要在运行测试前将自定义域文件导入到 Keycloak 中,请为 Keycloak 配置 Dev 服务
,如下所示:
%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.2. 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.getForms().get(0); // user 'alice' has the 'user' role form.getInputByName("username").type("alice"); form.getInputByName("password").type("alice"); page = form.getButtonByName("login").click(); assertEquals("alice", page.getBody().asNormalizedText()); } } private WebClient createWebClient() { WebClient webClient = new WebClient(); webClient.setCssErrorHandler(new SilentCssErrorHandler()); return webClient; } }
OidcWiremockTestResource
可识别 alice
和 admin
用户。用户 alice
默认具有用户角色 - 它可以通过 quarkus.test.oidc.token.
系统属性进行自定义。用户 user
-rolesadmin
默认具有 用户和
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.3. TestSecurity 注解
您可以使用 @TestSecurity
和 @OidcSecurity
注释来测试 web-app
应用端点代码,这取决于以下注入之一,或者全部四个:
-
ID
JsonWebToken
-
访问
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
以更改应用全局日志级别。