Spring Cloud OAuth2实现自定义token返回格式

2023-01-21 0 3,048

目录

最近读者朋友针对Spring Security OAuth2.0 想要陈某补充一些知识,如下:

Spring Cloud OAuth2实现自定义token返回格式

今天这篇文章就来回答其中一个问题如何自定义token的返回格式

问题描述

Spring Security OAuth的token返回格式都是默认的,但是往往这个格式是不适配系统,/oauth/token返回的格式如下:

{
    \"access_token\": token
    \"token_type\": \"bearer\",
    \"refresh_token\": xxxx
    \"expires_in\": xxx,
    \"scope\": \"xxx\",
    \"jti\": xxxx
    ....................
}

然而此时系统中的统一返回格式为:

{
    \"code\":xxx
    \"data\":xxx
    \"msg\":xxx
}

那么如何去对默认的格式进行修改呢?

解决方案

其实解决方案还是很多的,据陈某了解有如下两种解决方案:

  • 使用AOP的方式对/oauth/token这个接口的结果拦截修改
  • 重定义接口覆盖默认的

第一种方案呢可以实现,但是对于陈某来说不够优雅,实现比较简单,不显逼格

于是陈某今天介绍第二种方案,一种比较优雅的方式;想要理解第二种方式必须对Spring Security的底层源码有一些了解。

/oauth/token这个接口定义在哪里呢?通过源码我们知道定义在org.springframework.security.oauth2.provider.endpoint.TokenEndpoint中,如下:

@RequestMapping(value = \"/oauth/token\", method=RequestMethod.GET)
public ResponseEntity<OAuth2AccessToken> getAccessToken(Principal principal, @RequestParam
Map<String, String> parameters) throws HttpRequestMethodNotSupportedException {}

@RequestMapping(value = \"/oauth/token\", method=RequestMethod.POST)
public ResponseEntity<OAuth2AccessToken> postAccessToken(Principal principal, @RequestParam
Map<String, String> parameters) throws HttpRequestMethodNotSupportedException {}

可以看到针对这个接口定义了两个,一个是GET请求、一个是POST请求

TokenEndpoint其实就是一个接口,使用注解@FrameworkEndpoint标注,这个注解和@Controller的作用一样,如下:

@FrameworkEndpoint
public class TokenEndpoint extends AbstractEndpoint {}

那么知道在哪里定义的就好办了,模仿着它这个接口自己重新定义一个覆盖掉不就好了,如下:

@Api(value = \"OAuth接口\")
@RestController
@RequestMapping(\"/oauth\")
@Slf4j
public class AuthController implements InitializingBean {

    //令牌请求的端点
    @Autowired
    private TokenEndpoint tokenEndpoint;

    //自定义异常翻译器,针对用户名、密码异常,授权类型不支持的异常进行处理
    private OAuthServerWebResponseExceptionTranslator translate;

    /**
     * 重写/oauth/token这个默认接口,返回的数据格式统一
     */
    @PostMapping(value = \"/token\")
    public ResultMsg<OAuth2AccessToken> postAccessToken(Principal principal, @RequestParam
            Map<String, String> parameters) throws HttpRequestMethodNotSupportedException {
        OAuth2AccessToken accessToken = tokenEndpoint.postAccessToken(principal, parameters).getBody();
        return ResultMsg.resultSuccess(accessToken);
    }
}

可以看到接口内部不需要自己重写逻辑,只需要调用TokenEndpoint中的方法

注意:由于对TokenEndpoint中的端点重写了,因此前面定义的对用户名、密码之类的异常捕获的翻译类(OAuthServerWebResponseExceptionTranslator)将会失效,需要在全局异常中进行捕获

上面是/oauth/token的接口,/oauth/check_token这个校验token的接口如需自定义也是可以的,对应的类是org.springframework.security.oauth2.provider.endpoint.CheckTokenEndpoint

重写后代码如下:

@Api(value = \"OAuth接口\")
@RestController
@RequestMapping(\"/oauth\")
@Slf4j
public class AuthController implements InitializingBean {

    @Autowired
    private CheckTokenEndpoint checkTokenEndpoint;

    //自定义异常翻译器,针对用户名、密码异常,授权类型不支持的异常进行处理
    private OAuthServerWebResponseExceptionTranslator translate;
    
    /**
     * 重写/oauth/check_token这个默认接口,用于校验令牌,返回的数据格式统一
     */
    @PostMapping(value = \"/check_token\")
    public ResultMsg<Map<String,?>> checkToken(@RequestParam(\"token\") String value)  {
        Map<String, ?> map = checkTokenEndpoint.checkToken(value);
        return ResultMsg.resultSuccess(map);
    }

这种方式是不是很优雅?也很符合Spring Security的设计思想,AOP的方式还要对参数解析,重新包装

好了,关于测试的话自己搞一搞

总结

本篇文章介绍了认证服务中对token的返回格式自定义,总的来说还是比较简单的,有兴趣的也可以去网上找找关于AOP的方式。

以上就是Spring Cloud OAuth2实现自定义token返回格式的详细内容,更多关于Spring Cloud OAuth2的资料请关注其它相关文章!

:本文采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可, 转载请附上原文出处链接。
1、本站提供的源码不保证资源的完整性以及安全性,不附带任何技术服务!
2、本站提供的模板、软件工具等其他资源,均不包含技术服务,请大家谅解!
3、本站提供的资源仅供下载者参考学习,请勿用于任何商业用途,请24小时内删除!
4、如需商用,请购买正版,由于未及时购买正版发生的侵权行为,与本站无关。
5、本站部分资源存放于百度网盘或其他网盘中,请提前注册好百度网盘账号,下载安装百度网盘客户端或其他网盘客户端进行下载;
6、本站部分资源文件是经压缩后的,请下载后安装解压软件,推荐使用WinRAR和7-Zip解压软件。
7、如果本站提供的资源侵犯到了您的权益,请邮件联系: 442469558@qq.com 进行处理!

猪小侠源码-最新源码下载平台 Java教程 Spring Cloud OAuth2实现自定义token返回格式 http://www.20zxx.cn/463070/xuexijiaocheng/javajc.html

猪小侠源码,优质资源分享网

常见问题
  • 本站所有资源版权均属于原作者所有,均只能用于参考学习,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担
查看详情
  • 最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,建议提前注册好百度网盘账号,使用百度网盘客户端下载
查看详情

相关文章

官方客服团队

为您解决烦忧 - 24小时在线 专业服务