【发布时间】:2018-05-24 11:04:13
【问题描述】:
我们需要实现这个端点,因为我们有许多需要验证令牌的微服务。
根据this link,我们可以使用它来返回一些用户详细信息以及验证令牌。
我浏览了 spring 文档,但找不到任何东西。我们如何实现这一点,以便任何请求自动调用自省端点。我在这里问这个是因为我想听听人们对此的经验和建议。
【问题讨论】:
标签: spring-boot spring-security oauth-2.0 access-token
我们需要实现这个端点,因为我们有许多需要验证令牌的微服务。
根据this link,我们可以使用它来返回一些用户详细信息以及验证令牌。
我浏览了 spring 文档,但找不到任何东西。我们如何实现这一点,以便任何请求自动调用自省端点。我在这里问这个是因为我想听听人们对此的经验和建议。
【问题讨论】:
标签: spring-boot spring-security oauth-2.0 access-token
好的,在挖掘了 Spring 源代码和文档之后,我想我已经找到了答案,我在这里发布它以防万一有人有同样的问题。
Spring 有一个名为 /check_token 的端点。从我在CheckTokenEndpoint 类中可以看到,它是按照OAuth2 Token Introspection Endpoint 设计的:端点的唯一参数是'token'。
所以首先要让端点可以访问:
@Override
public void configure(AuthorizationServerSecurityConfigurer security) throws Exception {
security.checkTokenAccess("isAuthenticated()").tokenKeyAccess("permitAll()").passwordEncoder(passwordEncoder());
}
如您所见,checkTokenAccess() 允许任何经过身份验证的请求访问它。不要使用permitAll()
现在在您需要调用此端点的微服务或任何应用程序中,您需要配置 RemoteTokenServices:
@Bean
@Conditional(IfCheckTokenIsEnabled.class)
public ResourceServerTokenServices createResourceServerTokenServices() {
RemoteTokenServices tokenServices = new RemoteTokenServices();
tokenServices.setCheckTokenEndpointUrl("http://localhost:8099/oauth/check_token");
tokenServices.setClientId("my_client_id");
tokenServices.setClientSecret("client_secret"); //cannot be null
return tokenServices;
}
就是这样!
但是,我发现这个端点并不真正符合规范。在 OAuth2 中,它提到布尔类型的节点“活动”在响应中是强制性的,而该端点基本上提取访问令牌。但是,您可以创建自己的端点,只需为 Spring 配置 RemoteTokenServices 即可进行调用
【讨论】: