1.JWT的组成部分
JWT通常由三部分组成,分别是 Header(头部)、Payload(有效荷载)、Signature(签名)。
三者之间使用英文的“.”分隔,格式如下:
Header.Payload.Signature
2.JWT的三个部分各自代表的含义
JWT的三个组成部分,从前到后分别是 Header、Payload、Signature。
其中:
Payload部分才是真正的用户信息,它是用户信息经过加密之后生成的字符串。
Header和Signature是安全性相关的部分,只是为了保证Token的安全性。
3.JWT的使用方式
客户端收到服务器返回的JWT之后,通常会将它储存在localStorage或sessionStorage 中。
此后,客户端每次与服务器通信,都要带上这个WT的字符串,从而进行身份认证。推荐的做法是把JWT放在HTTP请求头的Authorization字段中,格式如下:
Authorization: Bearer <token>
核心注意点:在生成 Token 字符串的时候,一定要剔除 密码 和 头像 的等具有安全隐患值
1.运行如下的命令,安装生成 Token 字符串的包:
npm i jsonwebtoken@8.5.1
2.在 发送token的js文件的 模块的头部区域,导入 jsonwebtoken 包:
const jwt = require('jsonwebtoken')
3.创建 config.js 文件,并向外共享 加密 和 还原 Token 的 jwtSecretKey 字符串
2020.7.7日jwt更新之后,安装的express-jwt模块会默认为6.0.0版本,更新后的jwt需要在配置中加入algorithms属性,即设置jwt的算法。一般HS256为配置algorithms的默认值:
//我这里版本比较低不用配置algorithms
module.exports = {
jwtSecretKey: 'itheima No1. ^_^',
}
4.将用户信息对象加密成 Token 字符串
// 导入配置文件
const config = require('../config')
// 生成 Token 字符串
const tokenStr = jwt.sign(user, config.jwtSecretKey, {
expiresIn: '10h', // token 有效期为 10 个小时
})
5.将生成的 Token 字符串响应给客户端
res.send({
status: 0,
message: '登录成功!',
// 为了方便客户端使用 Token,在服务器端直接拼接上 Bearer 的前缀
token: 'Bearer ' + tokenStr,
})
- 配置解析 Token 的中间件
1.运行如下的命令,安装解析 Token 的中间件:
npm i express-jwt@5.3.3
2.在 app.js 中注册路由之前,配置解析 Token 的中间件:
// 导入配置文件
const config = require('./config')
// 解析 token 的中间件
const expressJWT = require('express-jwt')
// 使用 .unless({ path: [/^\/api\//] }) 指定哪些接口不需要进行 Token 的身份认证
app.use(expressJWT({
secret: config.jwtSecretKey }).unless({
path: [/^\/api\//] }))
3.在 app.js 中的 错误级别中间件 里面,捕获并处理 Token 认证失败后的错误
// 错误中间件
app.use(function (err, req, res, next) {
// 省略其它代码...
// 捕获身份认证失败的错误
if (err.name === 'UnauthorizedError') return res.cc('身份认证失败!')
// 未知错误...
})
这样你就成功的设置token和token验证拦截。
在请求中如果认证成功,你就能使用req.user获取token封装的用户的信息*