在集成测试中使用oauth / openid进行身份验证

时间:2020-04-21 10:47:23

标签: spring-security authorization openid keycloak

我在本地有以下情况:

  • 受Spring安全性和OpenID保护的Spring Boot应用程序 该应用程序被配置为使用授权代码流。
  • 我可以对其进行身份验证的密钥斗篷服务器

现在,我想编写一些集成测试,但是我有点受阻。

默认情况下,我的安全性配置为有状态的(因此,如果我导航到我的应用程序而不是访问令牌,则将获得一个会话ID cookie),这不是问题,因为我有一个API网关。 我有以下内容:

bytes_data - "\000\000\000\000\005\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\000....\000" (octal representation as supported by clion)
index = 0
size = 4096 (length of bytes_data)
file_path = "abc.binary"

我的application.properties类似于:

protected void configure(HttpSecurity http) throws Exception { // @formatter:off
    http.authorizeRequests(authorizeRequests -> authorizeRequests
            .anyRequest()
            .authenticated())
            .oauth2Login(AbstractAuthenticationFilterConfigurer::permitAll)
            .addFilterAfter(new CustomAuthenticationFilter(benutzerRepository), UsernamePasswordAuthenticationFilter.class)
            .logout(logout -> logout.logoutSuccessHandler(oidcLogoutSuccessHandler()));
}  // @formatter:on

这可行,但是现在,我想编写一些集成测试。因此,基本上是在测试中从我的Spring Boot应用程序调用API来触发一些操作,并且我的API当然受到保护。

所以我所做的就是让WebClient仅仅为了进行集成测试而尝试获取访问令牌,然后重复通常在后台“神奇地完成”的请求。

我的想法是: -使用webclient调用授权网址以获取代码 -将此代码与客户ID和客户机密一起发送以获取令牌

听起来很简单,但是我被阻止了。我一直从KEycloak收到error = invalid_request,我也不知道为什么。

我只是在尝试以下操作以获取代码(可能是错误的...):

spring.security.oauth2.client.registration.keycloak.client-id=application_name
spring.security.oauth2.client.registration.keycloak.client-secret=36a2740b-e7b9-4e66-9e2f-242a19d7815f
spring.security.oauth2.client.registration.keycloak.client-name=Keycloak
spring.security.oauth2.client.registration.keycloak.scope=openid, roles
spring.security.oauth2.client.registration.keycloak.authorization-grant-type=authorization_code
spring.security.oauth2.client.registration.keycloak.client-authentication-method=basic
spring.security.oauth2.client.registration.keycloak.redirect-uri={baseUrl}/login/oauth2/code/{registrationId}
spring.security.oauth2.client.provider.keycloak.authorization-uri=http://localhost:8180/auth/realms/application_name/protocol/openid-connect/auth
spring.security.oauth2.client.provider.keycloak.token-uri=http://localhost:8180/auth/realms/application_name/protocol/openid-connect/token
spring.security.oauth2.client.provider.keycloak.user-info-uri=http://localhost:8180/auth/realms/application_name/protocol/openid-connect/userinfo
spring.security.oauth2.client.provider.keycloak.jwk-set-uri=http://localhost:8180/auth/realms/application_name/protocol/openid-connect/certs
spring.security.oauth2.client.provider.keycloak.user-name-attribute=preferred_username

1 个答案:

答案 0 :(得分:0)

如果有人遇到相同的问题,我找到了解决方法。

因此,必须在Keycloak中为其客户端设置机密信息,然后启用服务客户端。然后可以执行以下操作:

%matplotlib inline

然后tadaaaa,您将获得测试的访问令牌。