1.jwt认证流程
用户登录成功后,服务端通过jwt生成一个随机token给用户(服务端无需保留token),以后用户再来访问时需携带token,服务端接收到token之后,通过jwt对token进行校验是否超时、是否合法
2.jwt创建token
jwt的生成token格式如下,即:由.
连接的三段字符串(Header、payload、signature )组成。
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
-
Header
固定包含算法和token类型,对此json进行base64url加密,这就是token的第一段{ "alg": "HS256", "typ": "JWT" }
-
payload
包含一些自定义的数据,对此json进行base64url加密,这就是token的第二段{ "sub": "1234567890", "name": "John Doe", "iat": 1516239022 }
-
signature
把前两段的base密文通过.
拼接起来,然后对其进行HS256
加密+加盐,再然后对hs256
密文进行base64url加密,最终得到token的第三段base64url( HMACSHA256( base64UrlEncode(header) + "." + base64UrlEncode(payload), your-256-bit-secret (秘钥加盐) ) )
-
注意:base64url加密是先做base64加密,然后再将
-
替代+
及_
替代/
3.jwt校验token
以后用户再次访问时候需要携带token,此时jwt需要对token进行超时及合法性校验
-
第一步:获取token对其进行切割
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
-
第二步:对第二段进行base64url解密,并获取payload信息,检测token是否过期
{ "id": "1234567890", "name": "chenglong", "exp": 1516239022 # 过期时间 }
-
第三步:把前两段的base密文通过
.
拼接起来,然后对其进行HS256
加密+加盐,再将token的最后一段进行base64url解密,再进行比较eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ 加密、加盐后的密文 = base64url解密(SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c) 如果相等,认证通过