如何在spring security oauth2中分离访问令牌和刷新令牌端点

Posted

技术标签:

【中文标题】如何在spring security oauth2中分离访问令牌和刷新令牌端点【英文标题】:How to separate access token and refresh token endpoint in spring security oauth2 【发布时间】:2020-04-19 16:33:47 【问题描述】:

在spring security oauth2中,获取访问令牌和刷新令牌使用同一个端点'/oauth/token',并通过参数grant_type'code'或'refresh_token'识别。

        if (isAuthCodeRequest(parameters)) 
            // The scope was requested or determined during the authorization step
            if (!tokenRequest.getScope().isEmpty()) 
                logger.debug("Clearing scope of incoming token request");
                tokenRequest.setScope(Collections.<String> emptySet());
            
        

        if (isRefreshTokenRequest(parameters)) 
            // A refresh token has its own default scopes, so we should ignore any added by the factory here.
            tokenRequest.setScope(OAuth2Utils.parseParameterList(parameters.get(OAuth2Utils.SCOPE)));
        

但我想将此端点分成两部分,例如用于获取访问令牌的“oauth/access_token”和用于刷新访问令牌的“oauth/refresh_token”。我该怎么做 ?

我尝试编写自定义端点类,并注册 bean 以覆盖默认的 TokenEndpoint ,但似乎效果不佳。

【问题讨论】:

【参考方案1】:

您可以为访问令牌和刷新令牌创建两个休息控制器方法,并使用休息模板在相关控制器方法内对 oauth/token 端点进行标准调用。

@RestController
public class TokenController 

    @RequestMapping("oauth/access_token")
    public TokenResponse getAccessToken() 
        //use rest template or httpclient to call to oauth/token and return converted TokenResponse
    

    @RequestMapping("oauth/refresh_token")
    public TokenResponse getRefreshToken() 
        //use rest template or httpclient to call to oauth/token and return converted TokenResponse
    

【讨论】:

我试过这种方式,但是rest模板的响应是401,也许端点'oauth/token'受spring安全过滤器保护,我会尝试配置这个。谢谢。

以上是关于如何在spring security oauth2中分离访问令牌和刷新令牌端点的主要内容,如果未能解决你的问题,请参考以下文章

如何在我的 Spring Boot Security OAuth2 应用程序中仅为某些类启用 OAuth2?

如何在 grails 和现有 oauth2 提供程序中使用 Spring Security 实现基于表单的登录

如何使用 Spring Cloud Security 实现 OAuth2“令牌交换”

Spring Security OAuth2 - 如何使用 OAuth2Authentication 对象?

如何将 spring security 与 rest oauth2 服务和 spring social 集成?

Spring Security实现OAuth2.0授权服务 - 进阶版