我使用以下节点模块对我的路由上的客户端请求进行身份验证:https://github.com/tgies/client-certificate-auth
var checkAccess = function(cert) {
return User.findOne({ 'subject': cert.subject.ST }, function (err, user) {
if (!err) {
if (user.active === true) {
return true;
}
else {
return false;
}
}
else {
return console.log(err);
}
});
};
app.post('/test', clientCertificateAuth(checkAccess), function(req, res) {
//...
});
问题是,checkAccess总是返回:false 我认为这是因为mongoose查询是异步的。
有没有办法等待数据库结果?
谢谢
答案 0 :(得分:1)
此处为client-certificate-auth模块的作者。
您的主要问题是return User.findOne(...)
- 您的函数正在此处返回,而不是等待异步调用。
3月发布的0.3版本在授权检查中处理异步更好。只需提供一个带有两个参数的函数,即checkAccess(cert, done)
。 clientCertificateAuth
会向您传递回调函数,然后您致电done(true)
表示成功,或done(false)
表示失败:
var checkAccess = function(cert, done) {
User.findOne({ 'subject': cert.subject.ST }, function (err, user) {
if (!err && user.active) {
done(true);
}
else {
done(false);
}
});
};
答案 1 :(得分:0)
将您的功能更改为此;
var checkAccess = function(req, res, next) {
User.findOne({ 'subject': cert.subject.ST }, function (err, user) {
if (!err) {
if (user.active === true) {
console.log("User active found");
req.result = true;
next();
}
else {
console.log("User active not found");
req.result = false;
next();
}
}
else {
console.log("Error occured while fetching user");
req.result = false;
next();
}
});
};
在您的控制器中;
app.post('/test', checkAccess, function(req, res, next) {
if (clientCertificateAuth(req.result) != true) {
console.log("Invalid cert due to active user not found");
next("Invalid certificate");
}
});
我上面做的是;只需在控制器请求中调用一个函数,我就根据db结果更新了req.result
。我在clientCertificateAuth
您的return
语句响应没有,因为mongoose查询可能尚未完成