1.4 Koa 集成JWT

什么是JWT

JWT 即为JSON Web Token的简写目前最流行的跨域认证解决方案。

JWT是通过在用户经过服务器认证后,由服务器发送给客户端一串JSON字符串,而这串字符串内部存储用户的信息,以及登录过期时间等等,在用户在其后的每次请求的请求头中带上这串JWT字符,达到认证的效果。

格式

JSON 数据格式

{
  "username": "zhangsan",
  "role": "user",
  "expiratAt": ""
}

字符数据格式

Header.Payload.Signature 
// 分别是三串加密字符串

请求格式

Authorization: Bearer <token> //注意中间有个空格

Header 格式

Payload

Signature

服务器对于JWT的签名,放置JWT被篡改 ,签名需要Header 和Payload 以及一个 服务器的Key 进行加密

常见的使用方式

可以存储在

  1. cookie 内部

  2. 存储在localstorage 中

使用

  1. cookie 发送 不能跨域

  2. 随着 Header 添加字段 Authorization: Bearer //注意中间有个空格

  3. post 请求的时候放在post请求的数据体内

  4. 因为Axios 可以设置拦截器与请求头自动 所以常放在Header 中与Axios一起使用

  5. 因为JWT 的服务器控制权比较低,也就是令牌发送后服务器就不能确定这个另外的使用者是否更换了,所以过期时间一般设置较短,另外容易发生JWT 被劫持,因此必须配合HTTPS使用。

  6. JWT 建议加密

JWT黑名单

  1. 客户端要求失效,可以对非正常操作过期时间直接设置为0的方式,

  2. 如果token 储存在redis 中,记录uid-time键值对,在redis 中设置黑名单,对于黑名单用户拒绝服务

  3. 客户端可以一键设置黑名单

  4. 用户重置密码 将token失效。

  5. jwt续签问题,一种解决方式是jwt中存储过期时间,服务端设置刷新时间,请求是判断是否在过期时间或刷新时间,在刷新时间内进行token刷新,而失效token记入黑名单;

  6. 而黑名单过大问题,可以采用记录UID-刷新时间方式解决,判断jwt签发时间,jwt签发时间小于UID-刷新时间的记为失效

  7. 还可以对用户的短期登录频次以及错误进行记录

实现

自己的代码实现

安装

生成token

前端接收到token存储

前端每次请求都带上token

后端对于token 的验证

后端再次拿到前端的token 主要是为了进行签名验证,查看签名是否被改动过,以及过期时间。

nodejs 使用jsonwebtoken

加密方法 jwt.sign

  1. 第一个参数 载荷

  2. 第二个参数 加密方式 或者是字符串 或者是一个key 文件

  3. 第三个参数为options 可选 见地址arrow-up-right 这些选项可以被签名生成过程时被添加到 payload 和header 中

  4. 第四个为callback 接收err 和token

验证 jwt.verify

与加密相对应

  1. 第一个参数 需要被解密验证的token

  2. 第二个参数 加密方式 或者是字符串 或者是一个对应的publickkey 文件

  3. 选项 见官方地址

jwt.decode(token [, options]) 对token解码

返回值为 字符串状态的 header 和payload 可以自己手动来进行验证。

koa-jwt

koa-jwt用来查看请求中是否有token信息的中间件

JWT 的常见问题解决

JWT 详细分析 作者:嚣张小飞arrow-up-right

jWT白名单

Last updated