Token

JWT简介

加密生成Token的算法可以是任意的,传输的形式也是多种多样(Cookie、Header),Flask默认的Session处理方案就是一种使用Cookie传输的Token,每个人都有自己的Token生成方案,有没有统一的规范和要求,以便更好的使用Token,于是就有了JWT。JWT是JSON Web Token的简写,是一个开放的标准。

  • 它是一个很长的字符串,中间用点(.)分隔成三个部分,并且都使用Base64编码
  • WT的三个部分依次如下。Header(头部)、Payload(负载)、Signature(签名)

JWT头(Header)

Header部分是一个JSON对象,描述JWT最基本的信息,例如,其类型及签名所用的算法等。通常是下面的样子

{
  "alg": "HS256",
  "typ": "JWT"
}

alg属性表示签名的算法(algorithm),默认是 HMAC SHA256(写成 HS256);typ属性表示这个令牌(token)的类型(type),JWT令牌统一写为JWT。最后,将上面的JSON对象使用Base64URL算法转成的字符串。

有效载荷(Payload)

Payload部分也是一个JSON对象也是使用Base64URL算法转成的字符串,用来存放实际需要传递的数据。JWT规定了7个官方字段,供选用

{
  "iss": "John Wu JWT",
  "iat": 1441593502,
  "exp": 1441594722,
  "aud": "www.example.com",
  "sub": "jrocket@example.com",
  "from_user": "B",
  "target_user": "A"
}
名称 说明
iss (issuer) 该JWT的签发者
exp (expiration time) 过期时间(为一个UNIX时间戳)
sub (subject) 该JWT所面向的用户
aud (audience) 接受该JWT的一方
nbf (Not Before) 生效时间
iat (Issued At) 签发时间
jti (JWT ID) 编号

处理官方字段,用户可以自己定义,如:

{
    "username": "test",
    "admin": false
}

验证签名(VERIFY SIGNATURE)

  • 签名哈希部分是对上面两部分数据签名,通过指定的算法生成哈希,以确保数据不会被篡改。

  • 首先,需要指定一个密码(secret)。该密码仅仅为保存在服务器中,并且不能向用户公开。然后,使用标头中指定的签名算法(默认情况下为HMAC SHA256)根据以下公式生成签名。如:

    HMACSHA256(base64UrlEncode(header) + "." + base64UrlEncode(payload), secret)

  • 在计算出签名哈希后,JWT头,有效载荷和签名哈希的三个部分组合成一个字符串,每个部分用"."分隔,就构成整个JWT对象。

相关推荐

  • 将session存储在服务器上的方案可以使用扩展Flask-Session
  • 前后端分类的应用,使用jwt的方式可以使用扩展Flask-JWT-Extended

results matching ""

    No results matching ""