我编写中间件来检查每次调用时的用户凭据。
因为它意味着工作:我从用户那里获得ID令牌。检查是否为其创建了令牌。如果数据是正确的 - 我保存它们以备将来使用。
middleware = function(req, res, next) {
var storage = {};
storage.ip = req.ip;
storage.logged = false;
storage.username = 'Guest';
if(req.headers.authorization) {
var base64Id = req.headers.authorization.split(' ');
try {
var decoded = jwt.verify(base64Id[1], app.get('salt'));
console.log('decoded',decoded);
Token.findOne({ jti: decoded.abc }, function(err, token) {
if (err) {
console.log(err);
}
if(token.browser !== req.headers['user-agent'] || req.ip !== token.ip) {
console.log('incydent: niezgodność ip lub przeglądarki');
} else {
User.findOne({_id: token.iss}, function(err, user) {
if(err) {
console.log(err);
}
if(user.name === decoded.name) {
console.log('data are correct');
storage.username = user.name;
storage.logged = true;
} else {
console.log('data are wrong');
}
});
console.log('next step');
}
});
} catch(err) {
if(err.name === 'TokenExpiredError') {
token.deactivate();
} else {
console.log('ERROR!',JSON.stringify(err,null,4))
}
}
}
req.storage = storage;
next();
};
在控制台上,我的最后一行是'数据是正确的',而console.log('next step');
的行从未执行过。控制台上也没有错误。
答案 0 :(得分:0)
Token.findOne
是一个异步函数(你给它一个回调)。
所以步骤是:
Token.findOne
next
(您的代码的最后一行)Token.findOne
的回调(但您的应用已经在下一个中间件中)你应该:
next()
移至您console.log('next step');
的位置(并删除最后一行)next(err)
以在出现任何错误时传播错误