概述:
Token 是在服务端产生的,当客户端传来的用户名/密码验证通过时,就会在服务器端生成一个Token返回给客户端,这个Token中包含了用户信息、过期时间等信息。客户端接收到返回的token后将其保存,在有效时间内客户端向服务器端发送请求时只需要带上这个token即可,无需再带上用户名和密码。
安装
npm install jsonwebtoken express-jwt -S
封装
var jwt = require('jsonwebtoken');
/*
生成token 参数
payload:基本信息
secretOrPrivateKey:密钥 casuallaborer
options:时效
*/
exports.createToken=function (payload,secretOrPrivateKey,options) {
return new Promise((resolve,reject)=>{
const token =jwt.sign(payload,secretOrPrivateKey,options);
resolve(token);
})
};
/*
验证token
token:token值
secretOrPrivateKey:密钥
*/
exports.verifyToken=function(token,secretOrPrivateKey){
return new Promise((resolve,reject)=>{
const info=jwt.verify(token.split(' ')[1],secretOrPrivateKey);
resolve(info);
})
}
使用
在入口文件app.js 引用,方便每次请求就会验证token
//...省略
var expressJwt =require('express-jwt');
var token=require('./tools/token');
app.all('*', (req, res, next) => {
res.header("Access-Control-Allow-Origin", "*");
// 特别注意需要加上Authorization, 前端要用Bearer token的格式
res.header("Access-Control-Allow-Headers", "content-type,Authorization,X-Requested-With");
res.header("Access-Control-Allow-Methods","PUT,POST,GET,DELETE,OPTIONS");
res.header("X-Powered-By",' 3.2.1')
res.header('Access-Control-Allow-Credentials: true');
res.header("Content-Type", "application/x-www-form-urlencoded;charset=utf-8");
next();
});
// 解析token信息
app.use(function (req,res,next) {
var tokenstr =req.headers['authorization'];
if (tokenstr === undefined){
return next();
}
else {
token.verifyToken(tokenstr,'zhangdada').then((data)=>{
console.log('解析:',data)
req.data=data;
return next();
}).catch((err)=>{
return next();
})
}
});
// 校验token是否过期,并且去除该地址不用校验
app.use(expressJwt({secret:'zhangdada',algorithms: ['HS256']}).unless({
path:['/api/admin/login']
}))
接口
var token = require('../../tools/token')
router.post('/api/admin/login', function (req, res) {
// 写在你自己的逻辑中
token.createToken({gh:gh,name:result.recordset[0].name},'zhangdada',{expiresIn:'1d'}).then((data)=>{
res.json({
status:'ok',
msg:result.recordset[0],
currentAuthority:'admin',
type: 'admin',
access :'admin',
token:data
})
console.log('我发送token',data);
})
})
router.post('/api/admin/currentUser',function (req, res) {
if (req.data){
res.json({
access:'',
name:req.data.gh,
msg:'身份验证成功'
})
}
else {
res.json({
access:'',
name:'未知 ',
msg:'身份验证失效'
})
}
})