【问题标题】:nodejs clientCertificateAuth always returns falsenodejs clientCertificateAuth 总是返回 false
【发布时间】:2014-03-27 07:32:30
【问题描述】:

我正在使用以下节点模块来验证我的路由上的客户端请求: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 查询是异步的。

有没有办法等待数据库结果?

谢谢

【问题讨论】:

    标签: node.js asynchronous mongoose


    【解决方案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);
            }
        });
    };
    

    【讨论】:

    • 感谢您提供的信息,我仍然使用您的组件,而且效果很好
    【解决方案2】:

    把你的函数改成这个;

    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");
        }
    });
    

    我在上面所做的是;只需在控制器请求中调用一个函数,我就根据数据库结果更新了req.result。我已经将这个结果用于clientCertificateAuth的控制器

    你的return语句没有响应,因为mongoose查询可能没有完成

    【讨论】:

    • 感谢您的快速回复,但同样的问题。总有:假的
    • 现在,its always true. if i minimize the if/else and only return false, its 无论如何:是的
    • 你有没有用户状态为真?
    • @Pumper 我已将 console.log 添加到我的代码中。你能测试一下,看看它在控制台上打印了什么
    • 日志显示:发现用户活跃
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-20
    • 2021-11-05
    • 2018-11-05
    • 2019-05-06
    • 2017-04-29
    • 2013-04-30
    相关资源
    最近更新 更多