okta oauth2 Spring security 所有受保护的页面重定向到登录

Posted

技术标签:

【中文标题】okta oauth2 Spring security 所有受保护的页面重定向到登录【英文标题】:okta oauth2 Spring security all protected pages redirect to login 【发布时间】:2021-03-21 22:16:34 【问题描述】:

我正在尝试在我的应用程序中使用 Spring Security 实现 okta(custom-provider) oauth2 sso 功能。应用程序成功提示用户登录并授权用户。我在下面给出了我的 spring 安全配置。这里的问题是除了登录名和其他一些给出 permitAll() 的 url,所有受保护的页面都被重定向到下面给出的 application.yml 中配置的“redirect-uri”(即登录 url)。我不明白为什么会发生这种情况,我也找不到 okta 文档中给出的任何解决方案。我在日志中看不到任何错误消息。每次我访问受保护或受保护的页面时,重定向都会发生在 http://localhost:8080/login 这是重定向 uri 但我需要重定向到用户选择的相应页面。我在这里有什么遗漏吗?

SecurityConfiguration.java

@Configuration
@EnableWebSecurity
public class SecurityConfiguration extends WebSecurityConfigurerAdapter 
    @Override
    public void configure(HttpSecurity http) throws Exception 
        http.antMatcher("/**").authorizeRequests()
            .antMatchers("/","/login**","/vendor/**", "https://fonts.googleapis.com/**", "/css/**",
                    "https://www.thymeleaf.org", "/js/**").permitAll()
            .anyRequest().authenticated()
            .and()
            .oauth2Login();
    

application.yml

security:
    oauth2:
      client:
        registration:
          custom-client:
            client-id: 
            client-secret: 
            scope: ["openid", "profile", "email", "address", "phone", "groups"]
            provider: custom-provider
            state: xoxoxo
            redirect-uri: http://localhost:8080/login
            client-authentication-method: basic
            authorization-grant-type: authorization_code
            filter-order: 3
        provider:
          custom-provider:
            token-uri: https://did.oktapreview.com/oauth2/v1/token
            authorization-uri: https://did.oktapreview.com/oauth2/v1/authorize
            user-info-uri: https://did.oktapreview.com/oauth2/v1/authorize
            user-name-attribute: name

有人可以

【问题讨论】:

【参考方案1】:

是的,肯定有问题。

重定向uri:http://localhost:8080/login

redirect-uri 应该是指向您的 OAuth2.0 客户端的回调端点的链接

在Spring Security OAuth2.0框架方面应该是如下模式:

重定向uri:“baseUrl/login/oauth2/code/registrationId”

其中“baseUrl”是您的 URL (http://localhost) 并且“registrationId”是注册名称,在您的情况下是“custom-client”

其实你可以指定一个没有特定registrationId和baseUrl的pattern作为redirect-uri参数,这样你的配置应该是这样的:

security:
    oauth2:
      client:
        registration:
          custom-client:
            client-id: 
            client-secret: 
            scope: ["openid", "profile", "email", "address", "phone", "groups"]
            provider: custom-provider
            state: xoxoxo
            redirect-uri: "baseUrl/login/oauth2/code/registrationId"
            client-authentication-method: basic
            authorization-grant-type: authorization_code
            filter-order: 3
        provider:
          custom-provider:
            token-uri: https://did.oktapreview.com/oauth2/v1/token
            authorization-uri: https://did.oktapreview.com/oauth2/v1/authorize
            user-info-uri: https://did.oktapreview.com/oauth2/v1/authorize
            user-name-attribute: name

另外,请注意您的凭据,应该填写。

【讨论】:

我收到错误代码:invalid_request 说明:'redirect_uri' 参数必须是客户端应用程序设置中的登录重定向 URI,如果我是 'localhost:8080/login/oauth2/code/custom-client' @SGN 重定向 uri 应该在 Okta 端的客户端应用程序设置中注册 我们组织中的 Okta 管理员通知重定向 uri 必须是 baseUrl/login 并且它适用于组织中的其他团队。如果是这种情况,有什么解决方法吗? 您的应用程序是localhost:8080/login/oauth2/code/custom-client OAuth2 服务器(Okta)的客户端,因此,就协议而言,重定向uri 只是从Oauth2.0 服务器接收授权码的回调端点。 redirect uri 是授权请求的必填参数,Okta 会将其与 Okta 端配置的重定向 uri 进行比较。重定向 uri 应该在没有占位符的 Okta 端配置(应该是明确的 url)在你的情况下它应该是 localhost:8080/login/oauth2/code/custom-client

以上是关于okta oauth2 Spring security 所有受保护的页面重定向到登录的主要内容,如果未能解决你的问题,请参考以下文章

Spring Boot 2 + OAuth2:为 Token 配置 Auth Code 交换

在不使用 Spring Security OAuth 的情况下实现 oauth2 授权服务器

利用OAuth2.0来构建一个基于Spring Boot的安全的端到端通信应用

Spring Boot 2.5.3 OAuth2 - Auth-Server 和 Web Service 分开,登录后没有端点工作

如何为 Webflux、Spring-Security、okta-spring-boot-starter 和 Okta-React 正确使用 CORS?

OAuth2FeignRequestInterceptor 的替代方案,依赖于已弃用的类