文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

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

2023-07-02 13:00

关注

这篇“Spring Cloud OAuth2怎么实现自定义token返回格式”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Spring Cloud OAuth2怎么实现自定义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}

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

解决方案

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

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

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

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

@RequestMapping(value = "/oauth/token", method=RequestMethod.GET)public ResponseEntity<OAuth3AccessToken> getAccessToken(Principal principal, @RequestParamMap<String, String> parameters) throws HttpRequestMethodNotSupportedException {}@RequestMapping(value = "/oauth/token", method=RequestMethod.POST)public ResponseEntity<OAuth3AccessToken> postAccessToken(Principal principal, @RequestParamMap<String, String> parameters) throws HttpRequestMethodNotSupportedException {}

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

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

@FrameworkEndpointpublic class TokenEndpoint extends AbstractEndpoint {}

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

@Api(value = "OAuth接口")@RestController@RequestMapping("/oauth")@Slf4jpublic class AuthController implements InitializingBean {    //令牌请求的端点    @Autowired    private TokenEndpoint tokenEndpoint;    //自定义异常翻译器,针对用户名、密码异常,授权类型不支持的异常进行处理    private OAuthServerWebResponseExceptionTranslator translate;        @PostMapping(value = "/token")    public ResultMsg<OAuth3AccessToken> postAccessToken(Principal principal, @RequestParam            Map<String, String> parameters) throws HttpRequestMethodNotSupportedException {        OAuth3AccessToken accessToken = tokenEndpoint.postAccessToken(principal, parameters).getBody();        return ResultMsg.resultSuccess(accessToken);    }}

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

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

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

重写后代码如下:

@Api(value = "OAuth接口")@RestController@RequestMapping("/oauth")@Slf4jpublic class AuthController implements InitializingBean {    @Autowired    private CheckTokenEndpoint checkTokenEndpoint;    //自定义异常翻译器,针对用户名、密码异常,授权类型不支持的异常进行处理    private OAuthServerWebResponseExceptionTranslator translate;            @PostMapping(value = "/check_token")    public ResultMsg<Map<String,?>> checkToken(@RequestParam("token") String value)  {        Map<String, ?> map = checkTokenEndpoint.checkToken(value);        return ResultMsg.resultSuccess(map);    }

以上就是关于“Spring Cloud OAuth2怎么实现自定义token返回格式”这篇文章的内容,相信大家都有了一定的了解,希望小编分享的内容对大家有帮助,若想了解更多相关的知识内容,请关注编程网行业资讯频道。

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     807人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     351人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     314人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     433人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     221人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯