功能描述
功能主要为服务的如何生成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);
})