我正在尝试设置 spring security (v5.8.8) 配置来连接到不同的 OAuth2 授权服务器。我正在使用 Azure 和 Okta 进行测试。我更愿意只使用 Spring Security,而不为每个 OAuth2 授权服务器实现 spring oaoth2 starters。
我有一个 Web 应用程序,它与带有自定义登录页面的普通 Spring Security 一起使用。现在我想将安全配置切换到 OAuth2 版本。我用于 OAuth2 的属性是:
spring.security.oauth2.client.provider=okta
spring.security.oauth2.client.provider.okta.issuer-uri=https://cs-docker-test.us.auth0.com/
spring.security.oauth2.client.registration.okta.client-id={client-id}
spring.security.oauth2.client.registration.okta.client-name={client-name}
spring.security.oauth2.client.registration.okta.client-secret={client-secret}
spring.security.oauth2.client.registration.okta.provider=okta
spring.security.oauth2.client.registration.okta.redirect-uri={baseUrl}/login/oauth2/code/okta/
spring.security.oauth2.client.registration.okta.authorization-grant-type=authorization_code
spring.security.oauth2.client.registration.okta.scope.0=openid
spring.security.oauth2.client.registration.okta.scope.1=profile
spring.security.oauth2.client.registration.okta.scope.2=email
我尝试使用的安全配置是:
httpSecurity
.oauth2Login(oauth2 -> {
oauth2.userInfoEndpoint(ep ->
ep.oidcUserService(customOidcUserService(coreSuiteZkJwtAuthorizationProperties())))
.successHandler(new AuthenticationSuccessHandler() {
@Override
public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response,
Authentication authentication) throws IOException, ServletException {
System.out.println ("In Authentication Success Handler");
response.sendRedirect(request.getContextPath() + "/" + WorkbenchConstants.HOME_PAGE);
}
})
.failureHandler(new AuthenticationFailureHandler() {
@Override
public void onAuthenticationFailure(HttpServletRequest request, HttpServletResponse response,
AuthenticationException exception) throws IOException, ServletException {
System.out.println ("In Authentication Failure Handler");
}
});
})
.logout(logout -> logout
.logoutSuccessHandler(oidcLogoutSuccessHandler())
);
当我在浏览器中点击 URL 时,我会被重定向到 Okta 服务器并看到登录屏幕。成功登录后,将使用查询参数中的代码调用重定向 URL。此时,我看到一个重定向到 Okta 以及随后回调到重定向 URL 的循环。
"GET /test HTTP/1.1" 302 -
"GET /test/ HTTP/1.1" 302 -
"GET /test/oauth2/authorization/okta HTTP/1.1" 302 -
"GET /test/login/oauth2/code/okta/?code=xxxxxxx&state=yyyyy HTTP/1.1" 302 -
"GET /test/oauth2/authorization/okta HTTP/1.1" 302 -
"GET /test/login/oauth2/code/okta/?code=aaaaaaaa&state=bbbbb HTTP/1.1" 302 -
"GET /test/oauth2/authorization/okta HTTP/1.1" 302 -
我正在尝试查找并理解 Spring Security 中处理从 Okta 到重定向 URL 的调用的代码。我的理解是一些代码将处理响应、创建身份验证实现、放置在安全上下文中并调用原始 URL。我没有看到任何调用失败处理程序或我的 OidcUserService 实现的身份验证成功。我看到 OAuth2AuthorizationRequestRedirectFilter 拦截
/test/oauth2/authorization/okta
并调用 sendRedirectForAuthorization。它不处理对重定向 URL 的回调,只是将处理传递给过滤器链中的下一个。
有人可以指出配置问题或者我如何调试重定向 URL 的处理吗?
谢谢。
授权代码流程如何与 Spring Security 配合使用
oauth2Login
:
/test/oauth2/authorization/okta
authorization
端点(在您的情况下为https://cs-docker-test.us.auth0.com/authorize
{baseUrl}/login/oauth2/code/okta/
,如您的conf中所指定)token
端点(在您的情况下为 https://cs-docker-test.us.auth0.com/oauth/token
)以获取令牌。这是从 OAuth2 客户端到授权服务器的直接调用(无需最终用户浏览器)仅当 OAuth2 客户端成功检索到令牌时,身份验证才成功。否则,它被认为失败,浏览器被重定向到...某个地方(我不确定我在你的conf中看到了这一点)。如果某个地方受到保护,则会启动一个新的授权代码流,这可能是循环的原因(当 Spring 尝试使用授权代码获取令牌时,可能会出现问题,但由于您没有使用
logging.level.org.springframework.security=DEBUG
从 Spring 应用程序提供日志)
,我不知道是什么)。
对于“通用”OAuth2 配置,您可能会发现 my starter 很有用。它消除了对大多数 Java 配置的需求,转而支持应用程序属性,包括权限(角色)映射、CORS 配置、“几乎标准”注销等等。