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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章