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 资源服务器不访问授权服务器进行访问令牌验证