gpt4 book ai didi

node.js - 如何在 Node.js + MongoDB + PassportJS 应用程序中进行异步身份验证

转载 作者:太空宇宙 更新时间:2023-11-03 23:44:00 27 4
gpt4 key购买 nike

我正在使用 Node.js、MongoDB 和 PassportJS,并且尝试使用本地策略进行身份验证(只需简单的 ID 和密码)。问题在于 Mongo 中的所有内容都是异步的,但 Passport 是同步的。我想过尝试“ Hook ” Passport ,以便我可以创建自己的回调,以便在 Mongo 回调返回后继续进行身份验证,但我不知道 Passport 代码是如何工作的(而且我还没有绝望到要启动调试器并跟踪它)。

身份验证过程实际上会成功完成,但不会在应用程序响应客户端之前完成,导致客户端认为它仍未经过身份验证。例如,在客户端尝试进行身份验证后,它会被重定向回登录表单,因为 session 未经身份验证。如果我只是刷新页面,我就会进入,因为此时身份验证回调已返回。

passport.use(new localAuth(function(username, password, done)
{
process.nextTick(function()
{
mc.connect('mongodb://127.0.0.1:27017/example', function(err, db)
{
if(err)
throw err;

db.collection('users').findOne({GUID: username}, function(err, results)
{
if(err)
throw err;
console.log('Here I am!');
db.close();
return done(null, username);
});
});
});
}));

(我意识到上面的代码没有验证任何内容。我只是尝试通过异步方法进行工作。)

我在上面尝试了多种不同的变体,但它们都遇到了同样的问题:在我的数据库查找有机会之前,赋予 localAuth() 的函数返回并且 Passport 继续进行身份验证去完成。我在 SO 上看到了几个关于尝试强制 mongo 同步工作的问题,而答案都是“不”。我看到了这个question ,这正是我的场景,我的方法是相同的,但我仍然存在回调返回后需要刷新的问题。

我应该如何在 Node.js + mongoDB + Passport 应用程序中执行身份验证?

更新我注意到“我在这里!”在第一次尝试期间(即刷新页面之前)出现在日志中。这让我认为身份验证正在完成,并且 session 是在第一次身份验证尝试期间设置的。无论从 localAuth() 的回调 (done()) 返回的内容都没有及时完成。然后,当我刷新时, Passport 尝试获取 session 并发现它在那里。这让我又回到了试图扣住 Passport 的话题。有谁知道在身份验证过程中何时调用 new localAuth()

更新

function authenticateUser(id, pass, cb)
{
console.log('1');
mc.connect('mongodb://127.0.0.1:27017/sp2010sec', function(err, db)
{
if(err)
throw err;

console.log('2');
db.collection('users').findOne({GUID: id}, function(err, results)
{
if(err)
throw err;
console.log('3');

return cb(err, id);
});
console.log('4');
});
console.log('5');
}

passport.use(new localAuth(function(username, password, done)
{
console.log('6');
authenticateUser(username, password, function(err, user)
{
console.log('7');
return done(err, username);
});
console.log('8');
}));

上面的代码生成此日志:

6

1

5

8

2

4

3

7

Passport 似乎没有等待调用done

最佳答案

我已经通过异步身份验证获得了创可贴,所以我将解释一下我做了什么。如果有人能给出更好的答案,我很乐意听到。

所以,问题是 mongoDB 是异步的,但 Passport 不是异步的,我能想到的一切都会导致 Passport 在 mongo 回调返回之前验证请求(或者失败)。我尝试了多种方法来 Hook Passport ,这样我什至都没有开始 Passport 身份验证,直到我完成了 mongo 的工作(某种预身份验证),但这也不起作用。我假设这与 Passport 的内部结构有关。

我最终做的是在应用程序启动时打开数据库连接,并在应用程序的生命周期中保持打开状态。这减少了一次回调,我认为这可以让 mongo 回调及时完成,以便 Passport 可以看到它。 这感觉像是一个潜在的竞争条件。我很想看到比这更好的答案或对真正发生的情况的解释。

更新

真正的问题是我没有使用 Passport 的成功/失败重定向;我在客户端处理这个问题,AJAX 调用一返回就开始处理(但不涉及 Passport 回调链)。一旦我开始在服务器端处理重定向,身份验证就开始按预期/广告的方式工作。

关于node.js - 如何在 Node.js + MongoDB + PassportJS 应用程序中进行异步身份验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17331046/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com