node + jwt 实现token身份验证
- 安装依赖 express-jwt
npm i express-jwt
- 将token校验相关数据导入配置文件
// setting.js
module.exports = {
token: {
// token密钥
signKey: 'blog_globM_token_key_$$$$',
// 过期时间
signTime: 3600 * 24 * 3,
// 请求头参数
header: 'authorization',
// 不用校验的路由
unRoute: [
{ url: '/login', methods: ['POST']},
{ url: '/register', methods: ['POST']}
]
}
}
- token配置文件(加密/解密)
// verify.js
const jwt = require('jsonwebtoken')
const setting = require('../setting')
const verify = {
// 设置token
setToken(email,_id){
return new Promise(resolve => {
let token = jwt.sign(
// 存储数据,自定义
{ email,_id },
// 密钥
setting.token.signKey,
// 过期时间
{ expiresIn: setting.token.signTime}
)
resolve(token)
})
},
getToken(token){
return new Promise((resolve, reject) => {
// 判断token是否存在,这里是根据空格分割
if(!token.split(' ').length){
reject({error: 'The token value is empty'})
}else{
// 解密token并返回数据
let data = jwt.verify(token.split(' ')[1],setting.token.signKey)
resolve(data)
}
})
}
}
module.exports = verify
- 主文件导入(app.js)
const expressJwt = require('express-jwt')
// 导入配置文件
const setting = require('./setting')
// 导入token校验文件
const verify = require('./public/verify')
// 解析token获取用户信息
app.use((req, res, next) => {
// 获取请求头中的参数
let token = req.headers[setting.token.header]
if(token === undefined){
return next()
}else{
// token校验并将校验结果保存至请求头中
verify.getToken(token).then(data => {
req.data = data
return next()
}).catch(_ =>{
return next()
})
}
})
//验证token是否过期并规定哪些路由不用验证
app.use(expressJwt({
secret: setting.token.signKey
}).unless({
//除了这个地址,其他的URL都需要验证
path: setting.token.unRoute
}))
//当token失效返回提示信息
app.use((err, req, res, next) => {
if (err.status === 401) {
return res.status(err.status).json({
status: err.status,
msg: 'The token is invalid',
error: err.name + ':' + err.message
})
}
})
- 接口中使用
const verify = require('../public/verify')
const setting = require('../setting')
// 生成token
verify.setToken(response.email,userData._id).then(token => {
return res.json({
status:0,
msg:'success',
token,
signTime: setting.token.signTime
})
})
// token 数据存储在req.data中
response.author = req.data._id
- 接口调用
headers 中传参,key: Authorization,value: 'Bearer ’ + token
Authorization : 'Bearer ’ + token
// axios
config.headers['Authorization'] = 'Bearer ' + token
萝卜砸大坑
发布了22 篇原创文章 · 获赞 2 · 访问量 2万+
私信
关注