若依项目学习笔记05——JWT
Gateway-JWT认证鉴权流程
一、网关认证件鉴权流程
目前主流的结合微服务网关及JWT令牌开发用户认证及服务访问鉴权的流程如下:
- 用户认证流程:用户向网关发送登录认证请求,网关将请求转发给认证服务。认证服务校验用户登录信息(用户密码、短信及图片验证码)等信息之后,如果校验成功颁发一个token令牌给该用户(这个令牌可以是JWT令牌)
- 网关级别访问鉴权:当用户访问系统内的其他业务服务接口时,需要携带登录认证的时候颁发的JWT token。网关验证JWT token的合法性,如果token不合法,则返回接口访问权限不足。如果token合法,则将请求按照网关的路由规则转发至相应的服务。
- 服务级别访问鉴权:网关级别的访问鉴权只是鉴别了JWT令牌的合法性,初步认定你是这个系统的用户,但是作为系统的用户并不意味着你可以访问所有的服务接口。通常基于用户的角色分类有更严格的访问权限划分。
令牌的颁发和校验需要基于同一个密钥,也就是说JWT 令牌的签名和解签必须有同一个密钥。谜面是"天王盖地虎",谜底必须是“宝塔镇河妖”,如果密钥对不上则令牌的校验失败。
所以通常网关层面除了转发请求之外需要做两件事:一是校验JWT令牌的合法性,二是从JWT令牌中解析出用户身份,并在转发请求时携带用户身份信息。这样系统内的其他业务服务在收到转发请求的时候,根据用户的身份信息判断决定该用户可以访问哪些接口。
二、流程优化方案
从上面的流程中我们可以看出
- 令牌的颁发是由认证服务完成的
- 令牌的校验是由网关完成的
也就是说这个JWT密钥相关的基础配置必须得在“认证服务”和“网关服务”上都配置一份,这样的配置分散不利于维护和密钥管理。所以我们优化一下流程:在gateway服务网关的服务上开发登录认证功能。优化后的流程如下:
三、学习本章内容需要具备的基础知识
从上面的流程看出,实现JWT认证鉴权流程其实并不是很复杂,但是要想真正的做好服务接口的鉴权流程,其涉及的基础知识还是非常多的。
3.1.在网关上实现登录认证
- 因为gateway网关的基础框架是Spring WebFlux,不是Spring MVC。所以你需要有一定的WebFlux开发知识。
- Spring WebFlux对于关系型数据库的响应式编程目前的支持非常有限。笔者多次试验mybatis目前肯定是不能用了,JPA兼容性比较好。所以你要有JPA的知识。(WebFlux不支持MysQL数据库访问的响应式编程,不等于它不支持MySQL,还是可以使用MYSQL数据库的)
3.2. Spring Security基础
系统内的其他业务服务在收到转发请求的时候,根据用户的身份信息判断决定该用户可以访问哪些接口。该如何实现?你要有Spring Security的基础知识及RBAC权限管理模型相关的基础知识。
以上的基础内容还是非常庞大的,任何一项都可以专门写一本书来介绍。**如果你学习本章的内容有困难,需要你先去补基础知识!
附录--上面的时序图代码
在线时序图编辑工具:https://www.websequencediagrams.com/
用户->+网关: 登录请求
网关-->-用户: return token
用户->+网关: 携带token访问业务
网关->网关: 校验token的合法性
网关->+其他服务: 携带用户身份信息转发请求
其他服务-->-网关: return data
网关-->-用户: return data