如何在 Spring Boot 中通过令牌自省端点实现令牌验证?

Posted

技术标签:

【中文标题】如何在 Spring Boot 中通过令牌自省端点实现令牌验证?【英文标题】:How to implement token verification via token introspection endpoint in Spring Boot? 【发布时间】:2018-05-24 11:04:13 【问题描述】:

我们需要实现这个端点,因为我们有许多需要验证令牌的微服务。

根据this link,我们可以使用它来返回一些用户详细信息以及验证令牌。

我浏览了 spring 文档,但找不到任何东西。我们如何实现这一点,以便任何请求自动调用自省端点。我在这里问这个是因为我想听听人们对此的经验和建议。

【问题讨论】:

【参考方案1】:

好的,在挖掘了 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 即可进行调用

【讨论】:

如果认证服务器不同怎么办。在我的情况下,客户端直接从身份验证服务器获取其访问令牌,然后使用该访问令牌调用我的微服务(资源服务器)。知道如何验证访问令牌吗?我有身份验证服务器的 Introspection URL @RajShah 不就是用你的 url 替换代码中的 localhost 吗? 现在可以了,授权服务器实际上已经关闭了

以上是关于如何在 Spring Boot 中通过令牌自省端点实现令牌验证?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Spring Boot 后端使用 jwt 令牌实现注销功能(使用休息端点)

如何在spring security oauth2授权服务器中通过jwt令牌获取用户信息?

在 Spring Boot 中使用令牌保护 api

Spring Boot中使用Actuator的/info端点输出Git版本信息

Spring Boot OAuth2:如何检索用户令牌信息详细信息

Spring boot:如何跳过特定端点的基本身份验证