架构图如下:
- 首先客户端请求授权服务器,获取Access Token
- 认证授权之后呢,请求后端服务,进入网管之后,先到授权服务器将Access Token转换成JWT (因为Access Token没有任何信息)
- JWT是包含用户信息的,在网关层面通过OAuth Filter 进行JWT的校验
- 微服务中其他服务按照需求实现OAuth Filter来验证解析JWT(JWT是自解析的特性)
为什么有一个Access Token 和 JWT的交换操作?
为什么要在API网管做统一的JWT校验?
因为Access Token是无意义的一个字符串,把这个字符串传到后端的每个服务上,每个业务服务都要去做校验。那么每个业务服务都要请求授权服务器,这样授权服务器的压力会很大,在网关统一校验可以大大减轻授权服务器的压力。
这种方式看起来会比较繁碎,好处是JWT的校验可以集中在API网关,其他服务也可以自己按需配置OAuth Filter。
还有一个好处就是,JWT统一由授权服务器管理,这样JWT的吊销会比较简单。
这种方式在用户授权的时候就使用JWT,这样整个流程看起来比较简单,好理解。JWT的校验bu
但是这种方式没有集中式的JWT校验机制,JWT在网关和在其他服务中都是自校验的。所有,无法对恶意JWT进行统一吊销操作。
只能等待JWT自然过期。
这种方式,建议设置JWT过期时间的时候,尽量时间短一些。
这一种方式和第一种方式差不多,相当于一个优化版本。
其他环节相差不多,只不过在网关统一请求授权服务器做JWT校验的时候,做了调整。
授权服务器将Access Token 和 JWT 缓存在Redis中,这样,当网管进行校验的时候,可以不用请求授权服务器,而是去Redis中取出Access Token 和 JWT ,在网关就可以完成校验。这样分担了授权服务器的压力。
其他的后端节点也可以使用OAuth Filter来完成JWT的自校验工作。
这样JWT令牌的吊销也会比较好实现。
这种方式是很多生产环节使用的方案。
- 业务指标监控
- 登录次数
- 授权次数
- 颁发令牌次数/刷新令牌次数
- 活跃令牌数
- 校验令牌次数
- 吊销令牌次数
- 注册Client数量
- 接口调用性能指标
- 授权接口
- 颁发Token接口
- Introspection 校验Token接口
- Revoke 吊销令牌
- 缓存Cache
- 高可用和水平扩容