OAuth2.0实战!使用JWT令牌认证!
大家好,我是不才陈某~
这是《Spring Security 进阶》的第3篇文章,往期文章如下:
文章都是成体系的,陈某默认看到这篇文章的读者都已经看了前期的文章,之前的知识点就不再详细介绍了。
今天这篇文章介绍一下OAuth2.0如何集成JWT颁发令牌,这也是目前企业中主流的令牌形式。
文章目录如下:
什么是JWT?
OAuth2.0体系中令牌分为两类,分别是透明令牌、不透明令牌。
不透明令牌则是令牌本身不存储任何信息,比如一串UUID,上篇文章中使用的InMemoryTokenStore就类似这种。
因此资源服务拿到这个令牌必须调调用认证授权服务的接口进行令牌的校验,高并发的情况下延迟很高,性能很低,正如上篇文章中资源服务器中配置的校验,如下:
透明令牌本身就存储这部分用户信息,比如JWT,资源服务可以调用自身的服务对该令牌进行校验解析,不必调用认证服务的接口去校验令牌。
JWT相信大家都有了解,分为三部分,分别是头部、载荷、签名,如下:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.
eyJhdWQiOlsicmVzMSJdLCJ1c2VyX25hbWUiOiJ1c2VyIiwic2NvcGUiOlsiYWxsIl0sImV4cCI6MTYzODYwNTcxOCwiYXV0aG9yaXRpZXMiOlsiUk9MRV91c2VyIl0sImp0aSI6ImRkNTVkMjEzLThkMDYtNGY4MC1iMGRmLTdkN2E0YWE2MmZlOSIsImNsaWVudF9pZCI6Im15anN6bCJ9.
koup5-wzGfcSVnaaNfILwAgw2VaTLvRgq2JVnIHYe_Q
头部定义了JWT基本信息,如类型和签名算法。
载荷包含了一些基本信息(签发时间、过期时间.....),另外还可以添加一些自定义的信息,比如用户的部分信息。
签名部分将前两个字符串用 . 连接后,使用头部定义的加密算法,利用密钥进行签名,并将签名信息附在最后。
OAuth2.0认证授权服务搭建
OAuth2.0分为认证授权中心、资源服务,认证中心用于颁发令牌,资源服务解析令牌并且提供资源。
1、案例架构
新建oauth2-auth-server-jwt模块,沿用上篇文章妹子始终没搞懂OAuth2.0,今天整合Spring Cloud Security 一次说明白!的代码,在其之上做些修改,目录如下:
2、令牌配置
令牌相关的配置都放在了AccessTokenConfig这个配置类中,代码如下:
1、 JwtAccessTokenConverter
令牌增强类,用于JWT令牌和OAuth身份进行转换
2、TokenStore
令牌的存储策略,这里使用的是JwtTokenStore,使用JWT的令牌生成方式,其实还有以下两个比较常用的方式:
- RedisTokenStore:将令牌存储到Redis中,此种方式相对于内存方式来说性能更好
- JdbcTokenStore:将令牌存储到数据库中,需要新建从对应的表,有兴趣的可以尝试
3、SIGN_KEY
JWT签名的秘钥,这里使用的是对称加密,资源服务中也要使用相同的秘钥进行校验和解析JWT令牌。
注意:实际工作中还是要使用非对称加密的方式,比较安全,这种方式后续文章介绍。
3、令牌管理服务的配置
这个放在了AuthorizationServerConfig这个配置类中,代码如下:
使用的是DefaultTokenServices这个实现类,其中可以配置令牌相关的内容,比如access_token、refresh_token的过期时间,默认时间分别为12小时、30天。
最重要的一行代码当然是设置令牌增强,使用JWT方式生产令牌,如下:
services.setTokenEnhancer(jwtAccessTokenConverter);
4、令牌访问端点添加tokenServices
在AuthorizationServerEndpointsConfigurer中添加这个令牌服务,代码如下:
好了,至此认证中心的JWT令牌生成方式配置完成了.........
案例源码已经上传GitHub,关注公号:码猿技术专栏,回复关键词 9529 获取!
OAuth2.0资源服务搭建
资源服务搭建非常简单了,配置一个JWT令牌校验服务即可。
1、案例架构
新建一个oauth2-auth-resource-jwt模块,目录如下:
2、令牌配置
直接复用授权服务的AccessTokenConfig,由于资源服务需要校验解析JWT令牌,因此直接复用即可,代码如下:
注意:这里的JWT加密的秘钥一定要和认证中心的一样。
3、配置令牌服务
生成的ResourceServerTokenServices对象,其中使用JWT令牌增强,如下:
4、资源ID和令牌校验服务配置
将资源id和令牌服务配置到ResourceServerSecurityConfigurer中,代码如下:
由于使用了JWT这种透明令牌,令牌本身携带着部分用户信息,因此不需要通过远程调用认证中心的接口校验令牌。
案例源码已经上传GitHub,关注公号:码猿技术专栏,回复关键词 9529 获取!
测试
下面通过获取令牌、调用资源进行测试逻辑是否走通。
1、使用密码模式获取令牌
POSTMAN请求如下:
可以看到已经成功返回了JWT令牌。
2、携带令牌调用资源服务
直接拿着获取的access_token调用资源服务的接口,请求如下:
好了,JWT令牌测试成功............
源码追踪
源码中最重要的部分当然是获取令牌、校验令牌这两个流程了,小陈某下面详细说说。
1、获取令牌
获取令牌就比较简简单了,当然从接口 /oauth/token入手了,这个接口在TokenEndpoint#postAccessToken()
方法中,如下图:
这个方法中有两个关键步骤,如下:
1、根据clientId加载客户端信息
这一步是从根据客户端传入的clientId获取客户端的详细信息,代码如下:
ClientDetails authenticatedClient = getClientDetailsService().loadClientByClientId(clientId);
这里的ClientDetailsService有两类,如下:
- InMemoryClientDetailsService:客户端配置存储在内存中,本篇文章所使用的便是这个
- JdbcClientDetailsService:客户端配置存储在数据库中,后续文章介绍。
2、生成OAuth2AccessToken返回客户端
OAuth2AccessToken是封装的返回对象,/oauth/token这个接口的作用就是将令牌封装到OAuth2AccessToken返回,代码如下:
OAuth2AccessToken token = getTokenGranter().grant(tokenRequest.getGrantType(), tokenRequest);
getTokenGranter():获取授权类型,比如密码类型、授权码类型
grant():这个方法则是真正的业务方法,其中调用DefaultTokenServices#createAccessToken() 方法生成令牌。
DefaultTokenServices这个还记得吗,令牌服务,在AuthorizationServerConfig配置文件配置的,如下:
createAccessToken()方法内部真正的业务方法其实是JwtAccessTokenConverter#enhance(),内部生成JWT令牌,封装进入OAuth2AccessToken对象返回,方法如下:
JwtAccessTokenConverter这个还记得吗?令牌增强类,在AccessTokenConfig这个配置文件中配置的,如下:
主流程图如下:
2、校验令牌
校验令牌的更加简单了,入口就在OAuth2AuthenticationProcessingFilter这个过滤器,内部会调用OAuth2AuthenticationManager中的authenticate()方法进行验证令牌。
校验主流程如下:
自己debug跟着源码试试吧............
案例源码已经上传GitHub,关注公号:码猿技术专栏,回复关键词 9529 获取!
最后说一句(别白嫖,求关注)
陈某每一篇文章都是精心输出,已经写了3个专栏,整理成PDF,获取方式如下:
- 《Spring Cloud 进阶》PDF:关注公号:【码猿技术专栏】回复关键词 Spring Cloud 进阶 获取!
- 《Spring Boot 进阶》PDF:关注公号:【码猿技术专栏】回复关键词 Spring Boot进阶 获取!
- 《Mybatis 进阶》PDF:关注公号:【码猿技术专栏】回复关键词 Mybatis 进阶 获取!
如果这篇文章对你有所帮助,或者有所启发的话,帮忙点赞、在看、转发、收藏,你的支持就是我坚持下去的最大动力!
OAuth2.0实战!使用JWT令牌认证!的更多相关文章
- OAuth2.0实战:认证、资源服务异常自定义!
大家好,我是不才陈某~ 这是<Spring Security 进阶>的第4篇文章,往期文章如下: 实战!Spring Boot Security+JWT前后端分离架构登录认证! 妹子始终没 ...
- 没错,用三方 Github 做授权登录就是这么简单!(OAuth2.0实战)
本文收录在个人博客:www.chengxy-nds.top,技术资源共享. 上一篇<OAuth2.0 的四种授权方式>文末说过,后续要来一波OAuth2.0实战,耽误了几天今儿终于补上了. ...
- emqx启用JWT令牌认证(包含hmac-based和public-key)
emqx连接启用jwt令牌认证 jwt令牌 概述 JWT 即 JSON Web Tokens 是一种开放的,用于在两方之间安全地表示声明的行业标准的方法(RFC 7519). 组成 令牌的形式 xxx ...
- 什么是JWT令牌认证?
当下,JWT(JSON Web Token)令牌认证已经变得越来越流行.本文主要介绍JWT令牌认证与传统的Session会话认证机制的区别. 为什么需要认证? HTTP是一种无状态协议,那就意味着当前 ...
- OAuth2.0实战之微信授权篇
微信开发三大坑: 微信OAuth2.0授权 微信jssdk签名 微信支付签名 本篇先搞定微信OAuth2.0授权吧! 以简书的登陆页面为例,来了解一下oauth2.0验证授权的一些背景知识: 1) 传 ...
- 开源干货!!!.NET Core + JWT令牌认证 + Vue.js(iview-admin) 通用动态权限(RBAC)管理系统框架[DncZeus]开源啦!!!
DncZeus 前言 关于 DncZeus DncZeus = Dnc + Zeus "Dnc"--.Net Core 的缩写: "Zeus"--中文译为宙斯, ...
- 实战模拟│JWT 登录认证
目录 Token 认证流程 Token 认证优点 JWT 结构 JWT 基本使用 实战:使用 JWT 登录认证 Token 认证流程 作为目前最流行的跨域认证解决方案,JWT(JSON Web Tok ...
- 基于spring boot2.0+spring security +oauth2.0+ jwt微服务架构
github地址:https://github.com/hankuikuide/microservice-spring-security-oauth2 项目介绍 该项目是一个演示项目,主要演示了,基于 ...
- Spring Cloud Security OAuth2.0 认证授权系列(一) 基础概念
世界上最快的捷径,就是脚踏实地,本文已收录[架构技术专栏]关注这个喜欢分享的地方. 前序 最近想搞下基于Spring Cloud的认证授权平台,总体想法是可以对服务间授权,想做一个基于Agent 的无 ...
随机推荐
- HTML基础-3
图像标签(<img>)和源属性(Src) 在 HTML 中,图像由 <img> 标签定义. <img> 是空标签,意思是说,它只包含属性,并且没有闭合标签. 要在页 ...
- Oracle ORA 12541 报错解决过程
Oracle 导入全库之后使用plsql登陆时报错 版本12C版本2 ORA-12541: TNS: No Listener 再oracle主机本地可以使用sqlplus 登陆,但是使用plsql无法 ...
- 启用MFA的office 365 账号如何连接Exchange online
第一篇随手笔记,从简单开始... 如何使用Exchange Online PowerShell呢? 以Windows操作系统为例,如Windows10:首先需要安装Exchange Online Po ...
- 用 Python 修改微信(支付宝)运动步数,轻松 TOP1
用 Python 修改微信(支付宝)运动步数,轻松 TOP1 项目意义 如果你想在支付宝蚂蚁森林收集很多能量种树,为环境绿化出一份力量,又或者是想每天称霸微信运动排行榜装逼,却不想出门走路,那么该py ...
- 《手把手教你》系列技巧篇(四十)-java+ selenium自动化测试-JavaScript的调用执行-下篇(详解教程)
1.简介 在实际工作中,我们需要对处理的元素进行高亮显示,或者有时候为了看清楚做跟踪鼠标点击了哪些元素需要标记出来.今天宏哥就在这里把这种测试场景讲解和分享一下. 2.用法 创建一个执行 JS 的对象 ...
- MyBatis-Plus 快速入门
1.简介 MyBatis-Plus (简称 MP)是一个 MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发.提高效率而生. 1.1.特性 无侵入:只做增强不做改变, ...
- tomcat9启动报错too low setting for -Xss
在tomcat下部署war包启动时报错,关键错误信息如下: Caused by: java.lang.IllegalStateException: Unable to complete the sca ...
- Spring中常用注解
1.@Component 创建类对象,相当于配置<bean/> 2.@Service @Service与@Component功能相同,写在ServiceImpl类上 3.@Reposito ...
- 生产者消费者模型及Golang简单实现
简介:介绍生产者消费者模型,及go简单实现的demo. 一.生产者消费者模型 生产者消费者模型:某个模块(函数等〉负责产生数据,这些数据由另一个模块来负责处理(此处的模块是广义的,可以是类.函数.协程 ...
- 互联网java面试宝典
1.为什么使用消息队列啊? 答题: 消息队列的核心功能就是:解耦合,异步,流量削峰解耦:接口调用发送,那如果E系统也要这个数据呢?那如果C系统现在不需要了呢?现在A系统又要发送第二种数据了呢?A系统负 ...