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


Posted in Java/Android onJune 25, 2022

最近读者朋友针对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的资料请关注三水点靠木其它相关文章!


Tags in this post...

Java/Android 相关文章推荐
浅析NIO系列之TCP
Jun 15 Java/Android
Springboot如何使用logback实现多环境配置?
Jun 16 Java/Android
Spring mvc是如何实现与数据库的前后端的连接操作的?
Jun 30 Java/Android
Spring中bean的生命周期之getSingleton方法
Jun 30 Java/Android
Java中多线程下载图片并压缩能提高效率吗
Jul 01 Java/Android
SpringBoot工程下使用OpenFeign的坑及解决
Jul 02 Java/Android
JavaCV实现照片马赛克效果
Jan 22 Java/Android
利用Sharding-Jdbc进行分库分表的操作代码
Jan 22 Java/Android
Android基于Fresco实现圆角和圆形图片
Apr 01 Java/Android
JAVA springCloud项目搭建流程
May 11 Java/Android
SpringBoot全局异常处理方案分享
May 25 Java/Android
Spring boot admin 服务监控利器详解
Aug 05 Java/Android
Spring Cloud OpenFeign模版化客户端
Jun 25 #Java/Android
Java服务调用RestTemplate与HttpClient的使用详解
Jun 21 #Java/Android
springboot创建的web项目整合Quartz框架的项目实践
Jun 21 #Java/Android
springboot读取resources下文件的方式详解
Jun 21 #Java/Android
java实现自定义时钟并实现走时功能
Jun 21 #Java/Android
SpringBoot使用ip2region获取地理位置信息的方法
Jun 21 #Java/Android
Android基础入门之dataBinding的简单使用教程
Jun 21 #Java/Android
You might like
全局记录程序片段的运行时间 正确找到程序逻辑耗时多的断点
2011/01/06 PHP
php与mysql建立连接并执行SQL语句的代码
2011/07/04 PHP
php使用百度ping服务代码实例
2014/06/19 PHP
PHP中的一些常用函数收集
2015/05/26 PHP
通过修改配置真正解决php文件上传大小限制问题(nginx+php)
2015/09/23 PHP
WordPress中使主题支持小工具以及添加插件启用函数
2015/12/22 PHP
php的PDO事务处理机制实例分析
2017/02/16 PHP
PHP多维数组指定多字段排序的示例代码
2018/05/16 PHP
jQuery ui1.7 dialog只能弹出一次问题
2009/08/27 Javascript
jquery jqPlot API 中文使用教程(非常强大的图表工具)
2011/08/15 Javascript
window resize和scroll事件的基本优化思路
2014/04/29 Javascript
深入理解JavaScript系列(19):求值策略(Evaluation strategy)详解
2015/03/05 Javascript
学习JavaScript正则表达式
2015/11/13 Javascript
动态JavaScript所造成一些你不知道的危害
2016/09/25 Javascript
Vue-resource实现ajax请求和跨域请求示例
2017/02/23 Javascript
addEventListener()与removeEventListener()解析
2017/04/20 Javascript
vue+vux实现移动端文件上传样式
2017/07/28 Javascript
mockjs,json-server一起搭建前端通用的数据模拟框架教程
2017/12/18 Javascript
vue swipe自定义组件实现轮播效果
2019/07/03 Javascript
Node.js API详解之 V8模块用法实例分析
2020/06/05 Javascript
Vue 禁用浏览器的前进后退操作
2020/09/04 Javascript
vue vant中picker组件的使用
2020/11/03 Javascript
[01:04:14]VP vs TNC 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/20 DOTA
[00:16]热血竞技场
2019/03/06 DOTA
用Python实现web端用户登录和注册功能的教程
2015/04/30 Python
wxpython绘制音频效果
2019/11/18 Python
PyQt5实现登录页面
2020/05/30 Python
Python实现图片查找轮廓、多边形拟合、最小外接矩形代码
2020/07/14 Python
python基于opencv 实现图像时钟
2021/01/04 Python
电子商务专业毕业生工作推荐信
2013/11/17 职场文书
三年级数学教学反思
2014/01/31 职场文书
领导失职检讨书
2014/02/24 职场文书
舞蹈教育学专业求职信
2014/06/29 职场文书
2014年档案管理员工作总结
2014/12/01 职场文书
就业指导讲座心得体会
2016/01/15 职场文书
2019年大学推荐信
2019/06/24 职场文书