在开发集群式或分布式服务时,鉴权是最重要的一步,为了方便对请求统一鉴权,一般都是会放在网关中进行处理。目前非常流行的一种方案是使用JWT,详细的使用说明,可以找相关的资料查阅,这里先不进行深入的引用了。主要使用它下面的特性:
- 它的数据使用JSON格式封装。所以JWT是可以在不同的开发语音中传递。
- 在payload可以加载部分业务数据,所以JWT可以在自身存储一些其他业务逻辑所必要的非敏感信息。
- 便于传输,jwt的构成非常简单,字节占用很小,所以它是非常便于传输的。
- 它不需要在服务端保存会话信息, 减少了内存占用,也不需要落地存储,提升了检查效率。
- JWT 使用的密钥都是在服务器端,不会暴露到客户端,所以是安全的。
具体的流程如下:
- 用户先访问登陆授权服务器,授权验证通过之后,返回给客户端授权服务器生成的JWT Token字符串
- 客户端再访问后面的接口时,将授权服务器返回的JWT Token添加到header中
- 服务器网关收到客户端请求时,检测JWT Token是否合法,如果不合法,拒绝访问,返回错误。
需要处理的另一个问题是JWT Token 失败的问题,比如用户修改了密码,原来的JWT Token就不能再被使用了,一般是做法是添加JWT Token的黑名单,直到JWT Token失败。毕竟触发某些事件让JWT Token失效还是低概率事件。
做法如下:
- 当JWT Token失效事件发生时,将原来的JWT TOKEN 加入的黑名单中,黑名单,可以存到Redis或数据库中。
- 为了提升处理效率,网关服务定时从授权服务刷新黑名单到网关服务内存中,这样检测JWT Token是否在黑名单中效率比较高
- 在黑名单中的JWT Token 过期后,自动从黑名单中删除,防止黑名单数量堆积。
- 为了防止用户JWT Token扩展,用户登陆之后检测,如果已存在JWT Token 且过期时间大于1天,就返回旧的JWT Token,否则自动延期,返回新的JWT Token
实现源码地址:https://gitee.com/wgslucky/xinyue-game-frame