node.js token身份验证
萝卜砸大坑 人气:0安装依赖 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
加载全部内容