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实现数据结构之并查集
Jun 23 Java/Android
jackson json序列化实现首字母大写,第二个字母需小写
Jun 29 Java/Android
SpringBoot集成Druid连接池连接MySQL8.0.11
Jul 02 Java/Android
Java 语言中Object 类和System 类详解
Jul 07 Java/Android
spring cloud 配置中心客户端启动遇到的问题
Sep 25 Java/Android
深入解读Java三大集合之map list set的用法
Nov 11 Java/Android
JVM的类加载器和双亲委派模式你了解吗
Mar 13 Java/Android
你知道Java Spring的两种事务吗
Mar 16 Java/Android
Java练习之潜艇小游戏的实现
Mar 16 Java/Android
java高级用法JNA强大的Memory和Pointer
Apr 19 Java/Android
Java存储没有重复元素的数组
Apr 29 Java/Android
Java中Dijkstra(迪杰斯特拉)算法
May 20 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
生成静态页面的PHP类
2006/11/25 PHP
php获取mysql版本的几种方法小结
2008/03/25 PHP
在WordPress中实现发送http请求的相关函数解析
2015/12/29 PHP
再谈PHP中单双引号的区别详解
2016/06/12 PHP
YII2框架中添加自定义模块的方法实例分析
2020/03/18 PHP
javascript限制文本框只允许输入数字(曾经与现在的方法对比)
2013/01/18 Javascript
js自调用匿名函数的三种写法(推荐)
2016/08/19 Javascript
全屏滚动插件fullPage.js使用实例解析
2016/10/21 Javascript
bootstrap选项卡使用方法解析
2017/01/11 Javascript
angularjs中ng-bind-html的用法总结
2017/05/23 Javascript
nodejs发送http请求时遇到404长时间未响应的解决方法
2017/12/10 NodeJs
js数组方法reduce经典用法代码分享
2018/01/07 Javascript
JavaScript中严格判断NaN的方法
2018/02/16 Javascript
浅谈手写node可读流之流动模式
2018/06/01 Javascript
对vue中methods互相调用的方法详解
2018/08/30 Javascript
vue构建动态表单的方法示例
2018/09/22 Javascript
vue组件实践之可搜索下拉框功能
2018/11/25 Javascript
详解Vue 单文件组件的三种写法
2020/02/19 Javascript
微信公众号网页分享功能开发的示例代码
2020/05/27 Javascript
[01:09]2014DOTA2国际邀请赛 TI4西雅图DOTA2 中国美女coser加油助威
2014/07/20 DOTA
基于Python实现的扫雷游戏实例代码
2014/08/01 Python
Python探索之自定义实现线程池
2017/10/27 Python
python如何实现内容写在图片上
2018/03/23 Python
python 列表输出重复值以及对应的角标方法
2019/06/11 Python
详解python路径拼接os.path.join()函数的用法
2019/10/09 Python
Python中bisect的用法及示例详解
2020/07/20 Python
解决python便携版无法直接运行py文件的问题
2020/09/01 Python
HTML5 localStorage使用总结
2017/02/22 HTML / CSS
MAC彩妆澳洲官网:M·A·C AU
2021/01/17 全球购物
如何在Cookie里面保存Unicode和国际化字符
2013/05/25 面试题
初中英语教师个人工作总结
2015/02/09 职场文书
感恩节寄语2015
2015/03/24 职场文书
考研导师推荐信范文
2015/03/27 职场文书
乱世佳人观后感
2015/06/08 职场文书
2016年共产党员个人承诺书
2016/03/24 职场文书
无线电知识基础入门篇
2022/02/18 无线电