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 相关文章推荐
解析Java中的static关键字
Jun 14 Java/Android
浅析NIO系列之TCP
Jun 15 Java/Android
死磕 java同步系列之synchronized解析
Jun 28 Java/Android
小程序与后端Java接口交互实现HelloWorld入门
Jul 09 Java/Android
Java使用JMeter进行高并发测试
Nov 23 Java/Android
Java如何实现通过键盘输入一个数组
Feb 15 Java/Android
Java基于Dijkstra算法实现校园导游程序
Mar 17 Java/Android
springboot 自定义配置 解决Boolean属性不生效
Mar 18 Java/Android
剑指Offer之Java算法习题精讲二叉树专项训练
Mar 21 Java/Android
Java实现添加条码或二维码到Word文档
Jun 01 Java/Android
Spring中bean集合注入的方法详解
Jul 07 Java/Android
httpclient调用远程接口的方法
Aug 14 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
Win2003服务器安全加固设置--进一步提高服务器安全性
2007/05/23 PHP
php跨域cookie共享使用方法
2014/02/20 PHP
百度工程师讲PHP函数的实现原理及性能分析(三)
2015/05/13 PHP
PHP用户验证和标签推荐的简单使用
2016/10/31 PHP
Laravel5.1 框架响应基本用法实例分析
2020/01/04 PHP
Mootools 1.2教程 Fx.Morph、Fx选项和Fx事件
2009/09/15 Javascript
jQuery 常见学习网站与参考书
2009/11/09 Javascript
jQuery 定时局部刷新(setInterval)
2010/11/19 Javascript
jquery下为Event handler传递动态参数的代码
2011/01/06 Javascript
简单几行JS Code实现IE邮件转发新浪微博
2013/07/03 Javascript
巧用局部变量提升javascript性能
2014/02/24 Javascript
页面js遇到乱码问题的解决方法是和无法转码的情况
2014/04/30 Javascript
jquery重复提交请求的原因浅析
2014/05/23 Javascript
moment.js轻松实现获取当前日期是当年的第几周
2015/02/05 Javascript
jQuery实现的动态伸缩导航菜单实例
2015/05/07 Javascript
JS字符串的切分用法实例
2016/02/22 Javascript
js中字符串编码函数escape()、encodeURI()、encodeURIComponent()区别详解
2016/04/01 Javascript
深入浅析JavaScript中的constructor
2016/04/19 Javascript
HTML5+Canvas调用手机拍照功能实现图片上传(上)
2017/04/21 Javascript
vue axios数据请求get、post方法及实例详解
2018/09/11 Javascript
layui将table转化表单显示的方法(即table.render转为表单展示)
2019/09/24 Javascript
layui 监听select选择 获取当前select的ID名称方法
2019/09/24 Javascript
微信小程序封装多张图片上传api代码实例
2019/12/30 Javascript
[01:06]DOTA2隆重推出2016冬季勇士令状 内含上海特级锦标赛互动指南
2016/02/17 DOTA
python的id()函数解密过程
2012/12/25 Python
使用Keras加载含有自定义层或函数的模型操作
2020/06/10 Python
Python3 pyecharts生成Html文件柱状图及折线图代码实例
2020/09/29 Python
美国儿童运动鞋和服装零售商:Kids Foot Locker
2017/08/05 全球购物
NFL加拿大官方网上商店:NHLShop.ca
2019/03/12 全球购物
工程造价与管理专业应届生求职信
2013/11/23 职场文书
三方协议书范本
2014/04/22 职场文书
培训协议书范本
2014/04/22 职场文书
基层党员对照检查材料
2014/09/24 职场文书
群众路线自查报告及整改措施
2014/11/04 职场文书
男人帮观后感
2015/06/18 职场文书
解决Mysql中的innoDB幻读问题
2022/04/29 MySQL