node express 下开发token功能 生成与验证

功能描述

功能主要为服务的如何生成token,如何验证token;express下主要使用JWT方式。
原生的jsonwebtoken 与 expressJwt
两种方式的简单实现

一、jsonwebtoken + expressJwt

安装

npm install express-jwt --save
npm install jsonwebtoken --save

生成

tokenUtil.secret,tokenUtil.expiresIn为公共文件定义的变量,便于后期维护

//引入
var jwt = require('jsonwebtoken');

var JwtMessage = {
	username:username,
	userId:userId,
	permission:permission
}
// tokenUtil.secret 公共密钥
const token = 'Bearer ' + jwt.sign(JwtMessage,tokenUtil.secret,tokenUtil.expiresIn);
res.json({
  status: 'ok',
  token: token 
})

验证
app.js

//验证token是否过期并规定哪些路由不用验证
app.use(expressJwt({
	secret: 'cy',
	algorithms:['HS256'],
	requestProperty:'auth',//自定义获取的信息位置,默认通过req.user获取
	credentialsRequired: false //是否允许无token请求
}).unless({
	path: ['/users/login']//除了这个地址,其他的URL都需要验证
}));

注:expressJwt验证的值为Bearer + ’ ’ + token ,且在hearders中authorization字段


二、使用jsonwebtoken生成与验证

生成
生成基本一样,也可以使用一中的方法

也可以封装一下,如下

  • 封装
var jwt = require('jsonwebtoken');
var signkey = 'cy';

var expiresIn={
		expiresIn: 3600 * 24 * 3
	}
// 密钥
export secret = signkey;
export expiresIn = expiresIn;

exports.setToken = function(username,userId,permission){
	return new Promise((resolve,reject)=>{
		const token = jwt.sign({
			username:username,
			userId:userId,
			permission:permission
		},signkey,{expiresIn:3600*24*3});
		resolve(token);
	})
}

exports.verToken = function(token){
	return new Promise((resolve,reject)=>{
		var info = jwt.verify(token, signkey ,(error,res) => { 
			var data={}
			if(error){
				data.code = '01';
				data.obj = error;
			}else{
				data.code = '00';
				data.obj = res;
			}
			return data
          });
		resolve(info);
	})
}
  • 调用文件生成token
tokenUtil.setToken(username,userId,permission).then((data)=>{
	return res.json({
			  status: 'ok',
			  token: data 
			})
	})

验证
在调用方法中先进行验证token

//tokenUtil为引入公共文件
var tokenUtil = require('../../public/javascripts/util/token.js');


 var token = req.headers['authorization'];
 tokenUtil.verToken(token).then((Data)=>{
 	res.json(Data);
 }).catch((err)=>{
 	console.log(err);
 })

猜你喜欢

转载自blog.csdn.net/qq_40557812/article/details/110057318