jsonwebtoken: 把json对象生成token格式
express-jwt: 把token对象翻译成json对象
1、安装jsonwebtoken npm i jsonwebtoken
2、安装express-jwt npm i express-jwt
安装并导入 JWT 相关的两个包,分别是 jsonwebtoken 和 express-jwt
const jwt = require('jsonwebtoken')
const expressJWT = require('express-jwt')
解析 post 表单数据的中间件
const bodyParser = require('body-parser')
app.use(bodyParser.urlencoded({ extended: false }))
在登录成功之后,调用 jwt.sign() 方法生成 JWT 字符串。并通过 token 属性发送给客户端
定义 secret 密钥,建议将密钥命名为 secretKey
const secretKey = 'ThisMe_123' //字符串随意写 越复杂越好)
router.post('/public/login', (req, res) => {
if (req.body.username !== 'zj' || req.body.password !== 'zj12345') {
return res.send({
static: 1,
msg: '用户名或密码错误'
})
}
//参数1:用户的信息
//参数2:加密的密钥
//配置对象:配置的有效日期
const token = jwt.sign({ username: req.body.username }, secretKey, { expiresIn: '30s' })
console.log(token)
res.send({
static: 0,
msg: '登录成功',
token: 'Bearer '+token
})
})
使用express-jwt
只要配置成功了 express-jwt 这个中间件,就可以把解析出来的用户信息,挂载到 req.user 属性上
7.0以前的版本配置方式:
router.use("/",expressJWT({ secret: secretKey }).unless({ path: [/^\/public\//] })) //排除以public开头的路径
7.0以后的配置方式
router.use("/", expressJwt.expressjwt({ secret: secretKey, algorithms: ['HS256'] }).unless({ path: [/^\/public\//] }))
全局错误处理中间件,捕获解析 JWT 失败后产生的错误
router.use((err, req, res, next) => { if (err.name === 'UnauthorizedError') { return res.send({ status: 406, msg: 'token不存在' }) } res.send({ status: 500, msg: '未知错误' }) })
浙公网安备 33010602011771号