node.js之express的token验证

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并返回给客户端
node.js之express的token验证_第1张图片
成功验证token
node.js之express的token验证_第2张图片
当token失效
node.js之express的token验证_第3张图片

你可能感兴趣的:(express)