原文地址:https://blog.csdn.net/qq_39905409/article/details/87905335
1、用jsonwebtoken生成token
2、用express-jwt验证token是否过期或失效
3、用jsonwebtoken解析出token中的用户信息,比如用户id
注意:
使用res.json()发送响应时,在此前加一个return,
即return res.json(),类似res.send()等函数也要加return,
而且是所有的地方都要加,即使是a请求的响应没加return,
当b请求到来时,也会报错:cant’t set headers after they are sent。
报错原因: 默认多次操作res或req
1、新建token_vertify.js文件,用于封装token生成和解析函数
// 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中自定义一个中间件用于验证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();
})
}
});
//验证token是否过期并规定哪些路由不用验证
app.use(expressJwt({
secret: 'mes_qdhd_mobile_xhykjyxgs' // 密匙
}).unless({
path: ['/login']//除了这个地址,其他的URL都需要验证
}));
app.use(express.static(path.join(__dirname, 'public')));
app.use('/login', loginRouter);
app.use('/users', usersRouter);
//当token失效返回提示信息
app.use(function(err, req, res, next) {
if (err.status == 401) {
return res.status(401).send('token失效');
}
});
3、在接口中运用上面定义的方法
// 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();
// 验证token
router.post('/vertify', function(req, res, next) {
console.log(req.data)
if(req.data){
return res.json({
msg:'身份验证成功'
})
}else{
return res.json({
msg:'未获取到用户信息'
})
}
next();
});
module.exports = router;
看一下结果:
请求/login生成token并返回给客户端
成功验证token
当token失效