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?