五、基于JWT的Token登录认证
1、JWT简介
JSON Web Token(缩写 JWT),是目前最流行的跨域认证解决方案。
session登录认证方案:用户从客户端传递用户名、密码等信息,服务端认证后将信息存储在session中,将session_id放到cookie中。
以后访问其他页面,自动从cookie中取到session_id,再从session中取认证信息。
另一类解决方案,将认证信息,返回给客户端,存储到客户端。下次访问其他页面,需要从客户端传递认证信息回服务端。
JWT就是这类方案的代表,将认证信息保存在客户端。
2、JWT 的原理
JWT 的原理是,服务器认证以后,生成一个 JSON格式的 对象,发回给客户端,就像下面这样。
{ "用户名": "admin", "角色": "超级管理员", "到期时间": "2019-07-13 00:00:00" }
以后,客户端与服务端通信的时候,都要发回这个 JSON 对象。服务器完全只靠这个对象认定用户身份。
为了防止用户篡改数据,服务器在生成这个对象的时候,会加上签名(详见后文)。
服务器不再保存任何 session 数据,也就是服务器变成无状态了,从而比较容易实现扩展。
3、JWT 的数据结构
实际的 JWT是一个很长的字符串,中间用点(.
)分隔成三个部分。 就像下面这样:
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiIsImp0aSI6IjNmMmc1N2E5MmFhIn0.eyJpYXQiOjE1NjI4MzM0MDgsImlzcyI6Imh0dHA6XC9cL3d3dy5weWcuY29tIiwiYXVkIjoiaHR0cDpcL1wvd3d3LnB5Zy5jb20iLCJuYmYiOjE1NjI4MzM0MDcsImV4cCI6MTU2MjkxOTgwOCwianRpIjoiM2YyZzU3YTkyYWEiLCJ1c2VyX2lkIjoxfQ.NFq1qQ-Z5c4pwit8ZkyWEwX6SBXmnHJcc6ZDgSD5nhU
JWT 的三个部分依次如下。
- Header(头部)
- Payload(负载)
- Signature(签名)
写成一行,就是下面的样子。
Header.Payload.Signature
3.1 Header
Header 部分是一个 JSON 对象,描述 JWT 的元数据,通常是下面的样子。
{ "alg": "HS256", "typ": "JWT" }
上面代码中,alg
属性表示签名的算法(algorithm),默认是 HMAC SHA256(写成 HS256);typ
属性表示这个令牌(token)的类型(type),JWT 令牌统一写为JWT
。
最后,将上面的 JSON 对象使用 Base64URL 算法(详见后文)转成字符串。
3.2 Payload
Payload 部分也是一个 JSON 对象,用来存放实际需要传递的数据。JWT 规定了7个官方字段,供选用。
名称 | 说明 | 解释 |
---|---|---|
iss (issuer) | 签发人 | issuer 请求实体,可以是发起请求的用户的信息,也可是jwt的签发者 |
sub (Subject) | 主题 | 设置主题,类似于发邮件时的主题 |
aud (audience) | 受众 | 接收jwt的一方,接收人 |
exp (expire) | 过期时间 | token过期时间,时间戳 |
nbf (not before) | 生效时间 | 当前时间在nbf设定时间之前,该token无法使用 |
iat (issued at) | 签发时间 | token创建时间 |
jti (JWT ID) | 编号 | 对当前token设置唯一标示 |
除了官方字段,你还可以在这个部分定义私有字段,下面就是一个例子。
{ "sub": "除了帅一无所有", "na