
什么是JWT认证?
json web token
使用一段字符串,用来进行用户身份认证的凭证,该字符串分成三段分别是头部,载荷,签证
JWT认证原理
以用户登录为实例,客户端第一次请求服务器会携带用户名和密码,请求到达服务器之后首先验证用户名和密码是否正确
登录成功之后服务器需要做两件事情
1.将用户的信息经过加密生成Token字符串
2.将加密好的Token字符串响应给客户端
客户端获取到服务器响应回来的Token字符串存储到LocalStorage中,再次发送请求时,需要通过请求头的Authorization字段将Token发送给服务器
服务器拿到Token字符串之后再还原成用户的信息对象进行认证,用户认证成功之后,再把当前用户信息相应给客户端
JWT组成
JWT字符串由三部分组成,分别是头部,载荷,签证,这三部分使用英文状态下的”.”分隔
组成Token的字符串是经过加密的,其中第二部分载荷(Payload)才是存放有效信息的地方,例如存放用户信息
第一部分头部(Header)和第三部分签证(Signature)是为了增强Token的安全性所设置的
如何使用
安装包
//生成token的包
npm install jsonwebtoken
//解密token的包 版本有很大的区别,高版本可以查阅官方文档
npm i express-jwt@5.3.3
定义secret密钥,新建一个全局文件config.js,全局共享字符串
module.exports = {
//secretKey可以自己定义
secretKey: 'Myki1ler!@!'
}
在路由中引入jwt和全局配置的密钥
const config = require('../config')
const jwt = require('jsonwebtoken')
在请求中使用jwt.sign生成密钥,建议将下方代码复制后格式化浏览
router.post('/login', (req, res) => {
const userInfo = req.body
if (userInfo.username !== 'admin' || userInfo.password !== '123') {
return res.send({status: 1, msg: "用户名或密码错误"})
}
//主要代码开始
res.send({
status: 0, msg: '登陆成功', token: jwt.sign({
//加密项
username: userInfo.username
},
//密钥
config.secretKey, {
// Token有效期
expiresIn: '1000s'
})
})
})
Apifox请求效果

JWT解密
在app.js中导入express-jwt的包
const expressJWT = require('express-jwt')
//使用app.use加上你配置的全局密钥 正则解释:以api开头的都不需要权限认证
//同样需要避坑 代码是按顺序执行的所有中间件要在路由前使用
app.use(expressJWT({secret: config.secretKey}).unless({path: [/^\/api\//]}))
express-jwt中间件配置成功之后,使用req.user对象访问从token字符串中解析出来的用户信息
注意:正常来说req中是没有user对象的,只有当expressJWT()中间件配置成功之后,req中才有了user对象,user对象中就包含了解析完成的用户信息
演示就直接在app.js中写入了
定义一个接口
app.get('/getData', (req, res) => {
const userInfo = req.user
res.send({
status: 0,
msg: '获取用户信息成功',
data: userInfo
})
})
测试
在apifox发起登录请求获取token

在Auth中设置BearerToken类型填写token测试
