Spring Boot OAuth2 资源服务器 - 调用 user-info-uri 或 token-info-uri 时出错

Posted

技术标签:

【中文标题】Spring Boot OAuth2 资源服务器 - 调用 user-info-uri 或 token-info-uri 时出错【英文标题】:Spring Boot OAuth2 Resource Server - Error by calling user-info-uri or token-info-uri 【发布时间】:2017-10-06 13:05:19 【问题描述】:

我尝试单独构建一个 spring boot oauth2 授权和资源服务器。

为了获得请求令牌的身份验证,资源服务器调用配置的 URI。

security:      
      oauth2:
            resource:
            user-info-uri: http://localhost:9999/uaa/user 

在授权服务器中,我实现了 /user 方法,如一些 教程,例如

https://spring.io/blog/2015/02/03/sso-with-oauth2-angular-js-and-spring-security-part-v

    @SpringBootApplication
    @RestController
    @EnableAuthorizationServer
    public class ApplicationAuthorizationServer   

    ... 

    @RequestMapping("/user")
    public Principal user(Principal user) 
      return user;
    
   

在 Spring Boot 中,自动配置会创建一个 UserInfoTokenService,OAuth2AuthenticationProcessingFilter 将使用它来调用期望返回类型 Map 的方法 /user。

第一个问题是!

校长不是地图。它是如何协同工作的?

第二个问题!

如果UserInfoTokenService调用授权服务器上的方法/user,则参数Principal为null,认证失败。

谁用值填充 Principal 参数?

最后一个问题是!

因为我徒劳地投入了太多时间,所以我尝试使用其他 URI

security:      
     oauth2:
       resource:
         token-info-uri: http://localhost:9999/uaa/oauth/check_token

但如果我只定义这个 URI,OAuth2AuthenticationProcessingFilter 会使用 DefaultTokenService 并尝试在资源服务器的 In-Memory 令牌存储中找到令牌。该服务没有找到它们并返回一个身份验证错误。

Spring Boot 自动配置应该创建一个像 TokeInfoTokenService 这样的服务来调用 token-info 端点。

为什么在这种情况下会创建 DefaultTokenService?

有人可以帮我吗?

【问题讨论】:

【参考方案1】:

我可以为您提供一些答案:

校长不是地图。它是如何协同工作的? 返回的映射将由 Spring security 获取,然后单个键将映射到 Principal 的字段。因此,如果地图包含“当局”字段,这将被映射到委托人当局。与 user_name 等相同。

谁在 Principal 参数中填入一个值? 如果是以下配置:

security:      
 oauth2:
   resource:
     token-info-uri: http://localhost:9999/uaa/oauth/check_token

RemoteTokenServices.java 在loadAuthentication(String accessToken) 方法中加载主体,并使用令牌转换器添加所有值。

希望这会有所帮助..

【讨论】:

以上是关于Spring Boot OAuth2 资源服务器 - 调用 user-info-uri 或 token-info-uri 时出错的主要内容,如果未能解决你的问题,请参考以下文章

Spring boot + oauth2:访问此资源需要完全身份验证

spring boot(1.3)基于oauth2资源服务器:不能使用@PreAuthorize方法安全

spring boot oauth2 ResourceServerConfigurerAdapter 不保护资源

Spring Boot 2 OAuth2 资源服务器不访问授权服务器进行访问令牌验证

如何使用密码授予在 Spring Boot Oauth2 资源服务器中处理 CORS

Spring Boot OAuth2 资源服务器:库如何在没有公钥的情况下验证 JWT 令牌?