Spring Security OAuth2 通用配置

问题描述 投票:0回答:1

我正在尝试设置 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 spring-oauth2
1个回答
0
投票

授权代码流程如何与 Spring Security 配合使用

oauth2Login
:

  1. 浏览器跟随
    /test/oauth2/authorization/okta
  2. 浏览器被重定向到授权服务器
    authorization
    端点(在您的情况下为
    https://cs-docker-test.us.auth0.com/authorize
  3. 用户成功通过身份验证后,浏览器将使用授权代码重定向回 OAuth2 客户端(在您的情况下为
    {baseUrl}/login/oauth2/code/okta/
    ,如您的conf中所指定)
  4. OAuth2 客户端(您的 Spring 服务器)调用授权服务器
    token
    端点(在您的情况下为
    https://cs-docker-test.us.auth0.com/oauth/token
    )以获取令牌。这是从 OAuth2 客户端到授权服务器的直接调用(无需最终用户浏览器)
  5. OAuth2 客户端响应另一个重定向,这取决于身份验证的最终状态

仅当 OAuth2 客户端成功检索到令牌时,身份验证才成功。否则,它被认为失败,浏览器被重定向到...某个地方(我不确定我在你的conf中看到了这一点)。如果某个地方受到保护,则会启动一个新的授权代码流,这可能是循环的原因(当 Spring 尝试使用授权代码获取令牌时,可能会出现问题,但由于您没有使用

logging.level.org.springframework.security=DEBUG 从 Spring 应用程序提供日志) 
,我不知道是什么)。

附注

对于“通用”OAuth2 配置,您可能会发现 my starter 很有用。它消除了对大多数 Java 配置的需求,转而支持应用程序属性,包括权限(角色)映射、CORS 配置、“几乎标准”注销等等。

© www.soinside.com 2019 - 2024. All rights reserved.