在写一个管理系统的token权限的时候,遇到一个问题。明明没有进行登录,直接去访问它的后台页面,但是并没有被拦截。在检查一遍后发现了一个小失误。
1.这是拦截的代码(这里并没有错误,可以正常使用)
app.all("*",async function (req, res, next) { let url = req.url console.log('[请求url:]'+url) let method = req.method.toUpperCase() console.log('[请求method:]'+method) if (method == 'GET'){ let query = req.query for (let key in query){ console.log(`[请求参数:]${key}=${query[key]}`) } } else if(method == 'POST'){ let body = req.body for (let key in body){ console.log(`[请求参数:]${key}=${body[key]}`) } } //令牌验证 //checkUrl是封装的一个api if (_t.checkUrl(req,['/user/login'])){ console.log('[令牌验证]') let token = req.query.token || req.headers.token console.log('[header]'+token) let result = await _t.verify(token || 1,global.secret) console.log(`[请求结果]${JSON.stringify(result)}`) //将请求对象重新缓存到请求头,备用 req.headers.user = result console.log('[req-header]'+req.headers.user) } next() });
//封装的
//个人觉得这个很有意思
tools.checkUrl = ({url},except = [])=>{ for (let i= 0, l = except.length;i < l;i++ ){ if (url.startsWith(except[i])){ console.log('token') return false } } return true }
jwtutil.js
// 安全拦截器
const jwt = require("jsonwebtoken");
/**
* 验证权限
* @param token
* @param secretkey 秘钥
* @param success
* @param error
*/
function verify(token, secretkey) {
console.log(token)
return new Promise((resolve, reject) => {
jwt.verify(token, secretkey, function (err, decode) {
if (err) {
console.log('[verifyErr]')
reject(err);
} else {
resolve(decode);
}
})
}).catch(e =>{
console.log('[verifyCatchErr]')
console.error(e)
throw new Error('令牌已过期')
})
}
/**
* 签名
* @param load 载荷 json对象 存储存在
* @param secretkey 秘钥
* @param expiresIn 过期时间 秒
* @returns {number | PromiseLike<ArrayBuffer>}
*/
function sign(load, secretkey, expiresIn) {
var token = jwt.sign(load, secretkey, {expiresIn: expiresIn});
return token;
}
module.exports = {verify, sign};
问题出在verify的promise
promise参数的位置是固定的
return new Promise((resolve, reject) => {}
错误写法:
return new Promise((reject,resolve) => {}