下面是一些 JWT 的使用场景:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/46153.html
1、 授权:这是 JWT 最常的使用场景。一旦用户登录,后续的每个请求都必须携带 JWT ,允许用户携带 Token 访问所有的路由、服务器和资源。单点登录时目前使用最广泛的一个场景,因为它开销小并且能够轻易的实现跨域访问。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/46153.html
2、信息交换:JWT Token 是一种非常好的可以在各个客户端实现安全的交互数据的方式。因为可以对 JWT 进行签名(例如使用公钥/私钥对进行加密),所以可以确保发生消息的人是我们期待的那个。此外,由于签名是根据 header 与 payload 计算出来的,因此还可以验证内容是否被篡改。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/46153.html
JWT 构成
JWT 就是一段字符串,由三段信息构成的,将这三段信息文本用 .
链接一起就构成了 Jwt 字符串。它们分别是文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/46153.html
- Header
- Payload
- Signature
就像这样:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/46153.htmleyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJuYW1lIjoiXHU2YjYzXHU1ZmMzXHU1MTY4XHU2ODA4XHU3ZjE2XHU3YTBiIiwiYWRtaW4iOnRydWV9.Y1H8vDimuq_FHZ7UDOLozAJNLoPTack-ubsxCEDDgBc
第一部分是头部(header):文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/46153.htmleyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9
第二部分是载荷(payload):文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/46153.htmleyJuYW1lIjoiXHU2YjYzXHU1ZmMzXHU1MTY4XHU2ODA4XHU3ZjE2XHU3YTBiIiwiYWRtaW4iOnRydWV9
第三部分是签证(signature):文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/46153.htmlY1H8vDimuq_FHZ7UDOLozAJNLoPTack-ubsxCEDDgBc
header
报头通常由两部分组成: 令牌的类型(即 JWT)和所使用的签名算法(如 HMAC、SHA256或 RSA)。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/46153.html
例如:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/46153.html{
"alg": "HS256",
"typ": "JWT"
}
jwt 的头部承载两部分信息:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/46153.html
- typ 字段是声明类型,这里是 jwt
- alg 字段是加密的算法,通常直接使用 HMAC 、HA256
将头部进行 base64 编码构成了第一部分文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/46153.html
payload
荷载是存放有效信息的地方,这些有效信息包含三个部分:注册的声明(Registered claims)、公共的声明(Public claims)、 私有的声明(Private claims)文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/46153.html
1、注册声明 :这是一组预先定义的声明,不是强制性的,而是推荐的,它们提供了一套易于使用的、可共用的声明。其中就有 iss(issuer 发行人),exp(expiration 过期时间),sub(subject 主题),aud(audience 受众),以及 其他的 。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/46153.html
2、公共声明:使用 JWT 的人可以随意定义这些声明。但是为了避免冲突应该在 互联网 JWT 注册表 中定义它们,或者可以定义为包含抗冲突名称的 URI。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/46153.html
3、私有声明:这些是为了在同意使用这些声明的当事人之间共享信息而提出的,既不是注册声明的也不是公共声明。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/46153.html
定义一个 payload :文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/46153.htmlpayload = {
"name": "正心全栈编程",
"admin": True
}
将其进行 base64 编码,就能得到 JWT 的第二部分。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/46153.html
signature
要创建 signature 部分,需要先获取 header、payload、secret(秘钥)、header 中指定的算法(alh),然后对其进行签名。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/46153.html
例如,如果想使用 HMAC SHA256 算法签名将按以下方式创建:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/46153.htmlHMACSHA256(
base64UrlEncode(header) + "." +
base64UrlEncode(payload),
secret
)
JWT 的第三部分是一个签证信息,这个签证信息由三部分组成:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/46153.html
- header (base64后的)
- payload (base64后的)
- secret
这个部分需要 base64 加密后的 header 和 base64 加密后的 payload 使用 .
连接组成的字符串,然后通过 header 中声明的加密方式进行加盐 secret
组合加密,然后就构成了 jwt 的第三部分。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/46153.html
将这三部分用 .
连接成一个完整的字符串构成了最终的 jwt。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/46153.html
注意:可以在 https://jwt.io/#debugger-io 验证生成的 JWT Token文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/46153.html