【问题标题】:How can I impersonate another user with Passport.js in Node?如何在 Node 中使用 Passport.js 模拟另一个用户?
【发布时间】:2017-06-26 19:27:48
【问题描述】:

在 Node 中使用 Passport.js,我有办法让一个用户冒充另一个用户吗?例如。作为应用程序的管理员,我希望能够在不知道密码的情况下以其他用户身份登录。

最简单的是,如果我可以更改序列化的用户数据(用户 ID),我会很满意,所以当调用 deserializeUser 时,它只会假定备用用户的身份。我已经尝试替换 req._passport.session.user 的值和 req.session.passport.user 的值,但最终效果是我的会话似乎变得无效并且 Passport 将我注销。

【问题讨论】:

    标签: javascript node.js passport.js


    【解决方案1】:

    Passport 提供了一个req.logIn 方法,以防您想手动进行身份验证。您可以使用它来登录任何用户,无论身份验证如何。

    以下是您可以使用它的方法。让管理员正常登录,他们将设置isAdmin 标志。

    然后在您的登录路径中的passport.authenticate 之前放置一个中间件。如果当前登录用户isAdmin,这将仅根据用户名登录用户。

    app.post('/login',
    
        function forceLogin(req, res, next) {
            if (!req.user.isAdmin) return next(); // skip if not admin
            User.findOne({
                username: req.body.username    // < entered username
            }, function(err, user) {
                // no checking for password
                req.logIn(user);
                res.redirect('/users/' + user.username);
            });
        },
    
        passport.authenticate('local'),
        function(req, res) {
            res.redirect('/users/' + req.user.username);
        }
    );
    

    【讨论】:

    • 这就是我所缺少的!谢谢!
    【解决方案2】:

    我还有另一种模仿方式,因为:

    • 我不想弄乱身份验证/护照的内部结构,例如 session storage / logIn / etc. 你必须非常了解它们 而且他们很容易改变,所以我会说这不是一个选择 我。
    • 另外,我还想知道是否采取了行动 超级用户(模拟)或普通用户(非模拟)。

    我做的是:

    • 为具有超级管理员角色的用户提供模拟路径,例如 /superadmin/impersonate?username=normaluser1 设置 req.user.impersonated.userid = normaluser1.userid

    • 然后我有一个中间件,它检查用户是否是超级管理员并被模拟:

      if (req.user.isAdmin && req.user.impersonated) { req.user.userid = req.user.impersonated.userid; }

    另外,我发现this 是一篇关于用户模拟的好文章。与我的方法类似,对于构建类似的东西很有启发。

    【讨论】:

      【解决方案3】:

      您的问题的答案是基本上:不。原因是:99% 的时间都在使用的会话库正在签署 cookie,因此如果您篡改数据,Web 服务器将拒绝它。

      解决此问题的方法是编写您自己的护照身份验证策略,但显然不会这样做,但我假设您在这里谈论的是使用内置策略。

      【讨论】:

      • 谢谢。我尝试创建一个新策略(我现有的策略基本上来自这个:code.tutsplus.com/tutorials/…),但无法让它发挥作用。我认为这是因为我试图在用户已经登录时调用护照的身份验证方法。如何“重新验证”已经登录的用户?
      • 不确定您的确切意思?验证用户(在任何时候)的方法是通过 passport.authenticate 的中间件助手 =)如果你愿意,你可以直接用你自己的回调来调用它。不过,这对于新的 SO 帖子可能会更好!
      • 我不同意,但我担心我不会得到答案,除非我这样做......我最初的问题是“一个用户如何使用 Passport.js 冒充另一个用户?”会议讨论只是我认为可能起作用的一种方式,但显然它不会。我仍然没有回答我原来的问题。还有其他方法可以更改 Passport 认为已登录的用户吗?
      • 您可以通过在服务器端生成一个新的会话来更改认为已登录的用户护照。这是唯一的方法。然后,您可以再次调用 passport.authenticate。
      • 您能否提供示例代码或将我指向解释如何执行此操作的某个地方?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-10-28
      • 2010-12-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-09
      相关资源
      最近更新 更多