为啥“req.user”在使用sails-auth 验证后总是在/user/me 控制器中为空?

Posted

技术标签:

【中文标题】为啥“req.user”在使用sails-auth 验证后总是在/user/me 控制器中为空?【英文标题】:Why "req.user" always empty in the /user/me controller after validation with sails-auth?为什么“req.user”在使用sails-auth 验证后总是在/user/me 控制器中为空? 【发布时间】:2016-11-07 22:27:34 【问题描述】:

我目前正在开始使用 Sails.js,并且我想将用户帐户添加到我的玩具应用程序中,因此我安装了创建基于 Passport 的用户身份验证系统的“sails-auth”包。我可以通过发送POST /user 创建新用户,我可以使用POST /auth/local 登录。

文档说:

通过带有参数标识符(电子邮件)和密码的 POST 到 /auth/local 使用本地策略进行身份验证。这也将创建一个会话。有关更多信息,请参见 passport.local。

但是,当我尝试 GET /user/me 时,它会路由到一个控制器操作,该控制器操作应该在会话中返回当前用户,而页面却给出了一个空响应。为什么会这样?我是否缺少某种配置步骤?

顺便说一句,我没有更改或弄乱sails-auth 包。它仍然是全新的; “我”动作如下所示:

  me: function (req, res) 
    res.ok(req.user);
  

编辑:我通过搜索sails-auth repo 中的问题找到了一个临时解决方法。您可以从req.session.passport.user 获取字符串用户ID,而不是从req.user 获取用户对象。

【问题讨论】:

【参考方案1】:

您所写的me 操作只会返回您作为用户参数传入的任何内容。 Sails 建立在 Express.js 之上,因此 req 是来自浏览器的请求,res 是对浏览器的响应。

您很可能将数据发送到req 正文中的me 操作,这就是您的响应为空的原因,简单地说,req.user 为空,因此响应为空。在这种情况下,您可以使用req.body.user 访问它,您也可以尝试var user = req.params();

为了调试和大致了解reqres 对象的结构,我建议您始终使用verbose 标志开始航行(在开发中,从不在生产中)。@987654333 @

那么你可以这样做:

me: function(req, res)
   sails.log.verbose(req);
   res.ok(req.user);

让它打印出整个 req 对象,这样你就知道req.user 中有什么。

虽然您通常会进行数据库查找,因为 user 参数将是一个 id。这意味着您的 me 函数可能看起来像(显然取决于您的 dbc,它可能会非常不同)如下:

me: function(req, res)
    var userId = req.body.user;
    User.find('user_id': userId.exec(function(err, user)
        if(err)
            //tell peeps there was an error
        else
            res.ok(user);
        
    );

路由和请求对象的最佳调试:

    '/*' : function(req, res, next) 
        sails.log.verbose("method: ", req.method, "\n body: ", req.body, "\n url:", req.url);
        next();
    ,

只需将其粘贴到路线模块的开头即可。

【讨论】:

谢谢,但我相信“用户”对象不是参数(通过在源中搜索)。它是由 AuthController 中的回调设置的,当它使用 Passport.js 时(参见图片i.imgur.com/WySYqRW.png)。此外,如何编辑“我”动作的源代码?它是 npm 模块的一部分。当我上次尝试编辑它(添加日志记录)时,日志消息没有显示出来。 @EricZhang 嗯,也许我没有正确理解你的问题,所以你没有写me 函数?但是您的路由表中有一条指向它的路由? 是的,me 函数不是我写的。该路线仅来自蓝图操作(UserController/me)。我认为如果我要关闭它们,那么我将不得不路由到me 函数。抱歉,如果不清楚! @EricZhang,我知道你从哪里来的想法 req.user 应该包含你的用户,但是来自客户端的每个req 都是它自己的对象并且有它自己的状态,所以调用进行身份验证,然后对/me单独 调用将生成两个不同的req 对象。 如果您将最后一个代码坑粘贴到您的路线模块的开头,然后使用--verbose 标志抬起,您可以在终端中看到有关req 对象的各种信息。

以上是关于为啥“req.user”在使用sails-auth 验证后总是在/user/me 控制器中为空?的主要内容,如果未能解决你的问题,请参考以下文章

在 React (ES6) 中访问 Passport 的 req.user? API 调用将 req.user 返回为未定义

如何在 ApolloServer 中获取 req.user

使用 google-passport-oauth 登录后 req.user 未定义

Passport + NodeJs + Express 得到“req.user”未定义

PassportJS:如何在我的视图中获取 req.user

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