封装一个中间件然后暴露出去
const mysql = require('../table/user') module.exports = ((req, res, next) => { // 获取当前访问的api地址 const url = req.originalUrl // 不需要进行验证的api var urlArr = ['/api/Applets/login'] // 验证当前的api是否存在不需要验证的api的列表里面 var is_next = urlArr.find(item => item === url) if (is_next) { next() return false } // 获取api传递过来的token const token = req.headers.token || '' // 获取api传递用户id const uid = req.body.uid || '' // 基本检测,token和id都不允许为空 switch(true) { case token === '': return res.status(401).json({ msg: 'wdnmd token 呢' }) case uid === '': return res.status(401).json({ msg: 'wdnmd id 呢' }) default: } // 进行数据库检测 const sql = `SELECT * FROM users WHERE id = ${uid} AND token LIKE '${token}'` mysql.query(sql, function (error, results, fields) { if (results[0]) { next() } else { return res.status(401).json({ msg: 'wdnmd先登录啊闸总' }) } }) })
自定义token:
var crypto=require("crypto"); var token={ createToken:function(obj,timeout){ console.log(parseInt(timeout)||0); var obj2={ data:obj,//payload created:parseInt(Date.now()/1000),//token生成的时间的,单位秒 exp:parseInt(timeout)||10//token有效期 }; //payload信息 var base64Str=Buffer.from(JSON.stringify(obj2),"utf8").toString("base64"); //添加签名,防篡改 var secret="hel.h-five.com"; var hash=crypto.createHmac('sha256',secret); hash.update(base64Str); var signature=hash.digest('base64'); return base64Str+"."+signature; }, decodeToken:function(token){ var decArr=token.split("."); if(decArr.length<2){ //token不合法 return false; } var payload={}; //将payload json字符串 解析为对象 try{ payload=JSON.parse(Buffer.from(decArr[0],"base64").toString("utf8")); }catch(e){ return false; } //检验签名 var secret="hel.h-five.com"; var hash=crypto.createHmac('sha256',secret); hash.update(decArr[0]); var checkSignature=hash.digest('base64'); return { payload:payload, signature:decArr[1], checkSignature:checkSignature } }, checkToken:function(token){ var resDecode=this.decodeToken(token); if(!resDecode){ return false; } //是否过期 var expState=(parseInt(Date.now()/1000)-parseInt(resDecode.payload.created))>parseInt(resDecode.payload.exp)?false:true; if(resDecode.signature===resDecode.checkSignature&&expState){ return true; } return false; } }; module.exports=exports=token;