原文地址:https://blog.csdn.net/qq_39905409/article/details/87905335
1鸯匹、用jsonwebtoken生成token
2雾消、用express-jwt驗(yàn)證token是否過期或失效
3灾搏、用jsonwebtoken解析出token中的用戶信息,比如用戶id
注意:
使用res.json()發(fā)送響應(yīng)時(shí)立润,在此前加一個(gè)return狂窑,
即return res.json(),類似res.send()等函數(shù)也要加return桑腮,
而且是所有的地方都要加泉哈,即使是a請求的響應(yīng)沒加return,
當(dāng)b請求到來時(shí)破讨,也會(huì)報(bào)錯(cuò):cant’t set headers after they are sent丛晦。
報(bào)錯(cuò)原因: 默認(rèn)多次操作res或req
1、新建token_vertify.js文件提陶,用于封裝token生成和解析函數(shù)
// token_vertify.js
var jwt = require('jsonwebtoken');
var signkey = 'mes_qdhd_mobile_xhykjyxgs'; // 密匙
exports.setToken = function(username,userid){
return new Promise((resolve,reject)=>{
const token = jwt.sign({
name:username,
_id:userid
},signkey,{ expiresIn:'0.01h' });
resolve(token);
})
}
exports.verToken = function(token){
return new Promise((resolve,reject)=>{
var info = jwt.verify(token.split(' ')[1],signkey);
resolve(info);
})
}
2烫沙、在app.js中自定義一個(gè)中間件用于驗(yàn)證token是否過期,如果沒過期隙笆,則解析出用戶信息
// app.js中部分代碼
var vertoken = require('./public/javascripts/token_vertify.js');
var expressJwt = require('express-jwt');
// 解析token獲取用戶信息
app.use(function(req, res, next) {
var token = req.headers['authorization'];
if(token == undefined){
return next();
}else{
vertoken.verToken(token).then((data)=> {
req.data = data;
return next();
}).catch((error)=>{
return next();
})
}
});
//驗(yàn)證token是否過期并規(guī)定哪些路由不用驗(yàn)證
app.use(expressJwt({
secret: 'mes_qdhd_mobile_xhykjyxgs' // 密匙
}).unless({
path: ['/login']//除了這個(gè)地址锌蓄,其他的URL都需要驗(yàn)證
}));
app.use(express.static(path.join(__dirname, 'public')));
app.use('/login', loginRouter);
app.use('/users', usersRouter);
//當(dāng)token失效返回提示信息
app.use(function(err, req, res, next) {
if (err.status == 401) {
return res.status(401).send('token失效');
}
});
3、在接口中運(yùn)用上面定義的方法
// login.js文件
var express = require('express');
var router = express.Router();
var settoken = require('../public/javascripts/token_vertify.js');
// 生成token
router.post('/', function(req, res, next) {
var username = 'slj';
var userid = "111";
settoken.setToken(username,userid).then((data)=>{
return res.json({ token: data });
})
return next();
});
module.exports = router;
// users.js文件
var express = require('express');
var router = express.Router();
// 驗(yàn)證token
router.post('/vertify', function(req, res, next) {
console.log(req.data)
if(req.data){
return res.json({
msg:'身份驗(yàn)證成功'
})
}else{
return res.json({
msg:'未獲取到用戶信息'
})
}
next();
});
module.exports = router;
看一下結(jié)果:
請求/login生成token并返回給客戶端
成功驗(yàn)證token
當(dāng)token失效