1、用jsonwebtoken生成token
2、用express-jwt验证token是否过期或失效
3、用jsonwebtoken解析出token中的用户信息,比如用户id
注意:
使用res.json()发送响应时,需要 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';
// 签发token
exports.setToken = function(username,userid){
return new Promise((resolve,reject)=>{
const token = jwt.sign({
name:username,
_id:userid
},signkey,{ expiresIn:'0.01h' });
resolve(token);
})
}
// 验证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('./token_vertify.js');
var expressJwt = require('express-jwt');
// 解析token获取用户信息,并将用户信息存入 user 中以备使用
app.use(function(req, res, next) {
var token = req.headers['authorization'];
if(!token){
return next();
} else {
vertoken.verToken(token).then((data)=> {
req.user = data;
return next();
}).catch((error)=>{
return next();
})
}
});
//验证token是否过期并约定哪些路由不用验证
app.use(expressJwt({
secret: 'mes_qdhd_mobile_xhykjyxgs'
}).unless({
path: ['/login']//除了这个地址,其他的URL都需要验证
}));
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失效');
}
});
// 配置哪些路由需要
jwt
验证哪些不需要,也可以通过在路由中间件第二个参数配置,示例如下:
const expressJwt = require(‘express-jwt’);
const authenticate = expressJwt ({ secret: ‘mes_qdhd_mobile_xhykjyxgs’ });
app.use(‘/auth’, authenticate, loginRouter); // 需要token验证的接口
app.use(‘/notAuth’, usersRouter); // 不需要token验证的接口
3、在路由中使用前面定义的方法
login.js文件
var express = require('express');
var router = express.Router();
var settoken = require('./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();
// 身份验证
router.post('/vertify', function(req, res, next) {
console.log(req.user)
if(req.user){
return res.json({
msg:'身份验证成功'
})
}else{
return res.json({
msg:'未获取到用户信息'
})
}
next();
});
module.exports = router;
看一下结果:
请求/login生成token并返回给客户端
成功验证token
当token失效
提供打包好的源码下载