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