Spring security oauth2 在 30 秒后未能通过颁发者验证
Posted
技术标签:
【中文标题】Spring security oauth2 在 30 秒后未能通过颁发者验证【英文标题】:Spring security oauth2 fails issuer validation after 30 seconds 【发布时间】:2019-04-02 15:50:03 【问题描述】:在响应式 spring webflux 服务中,我将端点配置为受 OAuth2 资源服务器保护。当我第一次启动服务器时,它会正确验证 Bearer 令牌,但大约 30 秒后,完全相同的请求开始失败,并出现以下错误:
error="invalid_token"
error_description="This iss claim is not equal to the configured issuer"
error_uri="https://tools.ietf.org/html/rfc6750#section-3.1"
我已验证令牌有效并且iss
声明似乎与spring.security.oauth2.resourceserver.jwt.issuer-uri
中配置的相同。如果没有正确配置,那么我将不会收到任何有效请求。
经过仔细检查,我发现错误源于 URL
比较 iss
声明和预期的 URL,因为 InetAddress.getAddress()
在前 30 秒匹配,但随后不匹配。这是使用 Azure AD 提供程序端点 https://sts.windows.net/tenantId/
并且我已验证 URL strings 匹配,而不是内部地址。这可能是什么原因造成的,我如何在最初的 30 秒后使用有效的发行人验证令牌?谢谢。
供参考,这是我的SecurityWebFilterChain
:
@Bean
public SecurityWebFilterChain securityWebFilterChain(ServerHttpSecurity http)
return http
.csrf().disable()
.authorizeExchange().anyExchange().authenticated()
.and().oauth2ResourceServer().jwt().and()
.and().build();
包括 Gradle 实现:
org.springframework.boot:spring-boot-starter-security:2.1.0.RC1
org.springframework.boot:spring-boot-starter-webflux:2.1.0.RC1
org.springframework.security:spring-security-oauth2-resource-server:5.1.1.RELEASE
org.springframework.security:spring-security-oauth2-jose:5.1.1.RELEASE
【问题讨论】:
我可以通过编写自定义ReactiveJwtDecoder
来解决这个问题,但这对于我所期望的基本功能来说似乎有点矫枉过正。
【参考方案1】:
看起来这是在 spring-security 中作为问题 #6073
输入的,并在 c70b65c
中得到解决。目前计划在 5.1.2.RELEASE 或 5.2.0.M1 中解决。
提交的解决方案将 URL 更改为字符串,除了删除阻塞的 DNS 查找调用之外,还允许相等性检查更加可靠。
【讨论】:
我为此拉了一个星期的头发。这个答案需要被投票 1000 次。以上是关于Spring security oauth2 在 30 秒后未能通过颁发者验证的主要内容,如果未能解决你的问题,请参考以下文章
oauth2 spring-security 如果您在请求令牌或代码之前登录
使用 spring-session 和 spring-cloud-security 时,OAuth2ClientContext (spring-security-oauth2) 不会保留在 Redis
Spring-Security OAuth2 设置 - 无法找到 oauth2 命名空间处理程序
Spring Security OAuth2 v5:NoSuchBeanDefinitionException:'org.springframework.security.oauth2.jwt.Jwt