passport.js req.user 正在返回:'Promise false ' - 如何获取当前会话的用户名?

Posted

技术标签:

【中文标题】passport.js req.user 正在返回:\'Promise false \' - 如何获取当前会话的用户名?【英文标题】:passport.js req.user is returning: 'Promise false ' - How do I get the current sessions' username?passport.js req.user 正在返回:'Promise false ' - 如何获取当前会话的用户名? 【发布时间】:2020-12-31 11:47:39 【问题描述】:

在 Node.js 中,我使用 passportJS LocalStrategy 对用户进行身份验证。还有这个功能

req.getAuthenticated()

让我知道当前会话是否经过身份验证。我还希望服务器返回当前会话的用户名。为此,我尝试访问 req 的用户属性。

if(req.isAuthenticated())
    let user = req.user.username;
  

但它返回“未定义”。我继续...

if(req.isAuthenticated())
    console.log(req.user);

它说 req.user 是一个'Promise false ',出于某种原因。我,然后尝试了

if(req.isAuthenticated())
    let user = await req.user;
    console.log(user);

它返回“假”。这是我第一次使用 passport.js,所以我可能设置错了,因为 req.user 不应该返回承诺,对吧?有什么建议吗?

更多信息:这是我的护照序列化/反序列化和 passport.use 函数的样子:

再次,getAuthenticated 函数完美运行。当用户登录时,他们被验证,当他们没有登录时,他们没有被验证。我只是无法获取 req.user 属性。

const initialize = (passport, UserCollection, getUserFromUsername, getUserFromId) => 
    const authenticateUser = async (username, password, done) => 
        let user = await getUserFromUsername(UserCollection, username);
        if(user === null)
            return done(null, false, message: 'The user with that username does not exist in the database.');
        
        try
            if(await bcrypt.compare(password, user.password))
                return done(null, user);
            
            else
                return done(null, false, message: 'Passwords do not match');
            
        
        catch 
            return done(null, false, message: 'There was a problem logging you in.')
        
    

    passport.use(new LocalStrategy(authenticateUser));
    passport.serializeUser((user, done) => 
        return done(null, user._id);
    );
    passport.deserializeUser((id, done) => 
        return done(null, getUserFromId(id));
    );

【问题讨论】:

【参考方案1】:

您应该等待deserializeUser 的承诺:

passport.deserializeUser(async (id, done) => 
        const user = await getUserFromId(id);
        return done(null, user);
    );

【讨论】:

谢谢!这是我在上面的代码中遇到的两个问题之一。第二个问题是我没有将 User 数据库模型传递给 getUserFromId

以上是关于passport.js req.user 正在返回:'Promise false ' - 如何获取当前会话的用户名?的主要内容,如果未能解决你的问题,请参考以下文章

req.user 使用 passport.js 1-2 分钟后清除

Passport.js、会话和反应 |从 /login 路由以外的任何路由访问 req.user 是未定义的

Express + Passport.js:req.user 未定义

无法使用 Passport.js 和 Express 4 访问 req.user

连续登录后未定义 Passport context.req.user (express/graphql)

如何告诉 Passport JS 中的 typescript req.user 永远不会被定义?