jwt

  • json web token ,一般用于用户认证(前后端分离小程序/微信小程序/app开发)
  • 基于传统的token认证
    • 用户登录,服务端返回token,并将token保存在服务端(服务端的数据库中)
    • 以后用户再来访问时,需要携带token,服务端获取token后,再去数据库中获取token进行校验(与服务器的数据库中的token进行对比校验)
  • jwt
    • 用户登录,服务端给用户返回一个token(服务端不保存)
    • 以后用户再来访问,需要携带token,服务端获取token后,再做token校验(算法校验)
    • 优势:相较于传统的token相比,它无需在服务端保存token

jwt的实现过程

  • 第一步,用户提交用户名和密码给服务端,如果登陆成功,使用jwt创建一个token,并给用户返回

    eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
    

    注意:jwt生成的token是由三段字符串组成的,用 .连接起来

    • 第一段字符串,HEADER:ALGORITHM & TOKEN TYPE

      json 转化成字符串,然后做base64url加密(先用base64加密,然后做特殊符号替换)

      {
        "alg": "HS256",
        "typ": "JWT"
      }
      
    • 第二段字符串,PAYLOAD:DATA

      json 转化成字符串,然后做base64url加密(先用base64加密,然后做特殊符号替换)

      {
        "sub": "1234567890",
        "name": "John Doe",
        "iat": 1516239022  #超时时间(exp)
      }
      
    • 第三段字符串,VERIFY SIGNATURE

      • 第1/2部分的密文拼接起来
      • 对前两部分密文进行HASH256加密+加盐(增加随机字符串)
      • 再做base64url加密
      HMACSHA256(
        base64UrlEncode(header) + "." +
        base64UrlEncode(payload),
        your-256-bit-secret
        )
      
  • 以后用户再来访问的时候,需要携带token,后端需要对token进行校验

    • 获取token

    • 第一步:切割token

      eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
      
    • 第二步:把第二段进行base64url解密,并获取payload信息,检测是否超时

      {
        "sub": "1234567890",
        "name": "John Doe",
        "iat": 1516239022  #超时时间(exp)
      }
      
    • 第三步:

      • 把第1/2段拼接
      • 再次执行hash256加密 + 加盐
      • 密文 = base64解密(SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c),如果相等,表示token未被修改过,则认证通过

应用

pip install pyjwt