1)JWT简介
JWT,全称是Json Web Token, 是JSON风格轻量级的授权和身份认证规范,可实现无状态、分布式的Web应用授权;官网:https://jwt.io (JWT,生成Token加密字符串的一个标准或格式!)
GitHub上jwt的java客户端:https://github.com/jwtk/jjwt
2)JWT数据格式
JWT包含三部分数据Header:头部,通常头部有两部分信息:声明类型,这里是JWT签名算法。自定义我们会对头部进行base64编码,得到第一部分数据

Payload:载荷,就是有效数据,一般包含下面信息:
用户身份信息(注意,这里因为采用base64加密,可解密,因此不哟啊存放敏感信息)
tokenID:当前这个JWT的唯一标识
注册声明:如token的签发时间,过期时间,签发人等
这部分也会采用base64加密,得到第二部分数据


Signature:签名,是整个数据的认证信息,一般根据前两步的数据,再加上服务的密钥(secret)(不要泄露,最好周期性更换),通过加密算法生成,用于验证整个数据完整和可靠性
3)登录和鉴权流程:JWT+HS256算法

授权流程:
用户请求登陆,写到用户名密码到授权中心
授权中心携带用户名密码,到用户中心查询用户
查询如果正确,生成JWT凭证
返回给用户
鉴权流程:
用户请求某微服务功能,携带JWT
微服务将jwt交给授权中心校验
授权中心校验结果到微服务
微服务判断校验结果,成功或失败
失败则直接返回401
因为jwt签发的token中已经包含了用户的身份信息,并且每次请求都会携带,这样服务的无需保存用户信息,甚至无需去数据库查询,完全符合Rest的无状态规范。
但是,上面的流程存在一个问题是,因为JWT校验所需的盐统一存放在授权中心,所以每个微服务每次都需要把JWT交给授权中心校验,这样效率就低了,可以使用RSA非对称加密来晚上以上流程
5)登录和鉴权流程:JWT+RSA
有了非对称加密,我们就可以改变你签名和验签的方式了:
生成RSA密钥对,私钥存放在授权中心,公钥下发给微服务
在授权中心利用私钥对JWT签名
在微服务利用公钥验证签名有效性
因为非对称加密的特性,不用担心公钥泄露问题,因为公钥是无法伪造签名的,弹药确保私钥的安全隐秘


