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