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

Spring-Security OAuth2 设置 - 无法找到 oauth2 命名空间处理程序

Spring Security OAuth2 v5:NoSuchBeanDefinitionException:'org.springframework.security.oauth2.jwt.Jwt

如何使用spring-security,oauth2调整实体的正确登录?