node.js 实现 token 身份验证

node + jwt 实现token身份验证

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
发布了25 篇原创文章 · 获赞 4 · 访问量 123万+

猜你喜欢

转载自blog.csdn.net/weixin_45266125/article/details/104050932