如何在Node中使用Passport.js模拟另一个用户?

时间:2015-01-26 00:01:17

标签: javascript node.js passport.js

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

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

3 个答案:

答案 0 :(得分:12)

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

答案 1 :(得分:2)

我有另一种冒充方式,因为:

  • 我不想像认证/护照这样的内部混乱 会话存储/登录/等等你必须非常了解它们 而且他们也很容易改变,所以我说这不是一个选择 我。
  • 此外,我还想知道是否采取了行动 超级用户(模仿)或普通用户(未模仿)。

我的工作是:

  • 为具有superadmin角色的用户设置路由,例如/superadmin/impersonate?username=normaluser1设置req.user.impersonated.userid = normaluser1.userid

  • 然后我有一个中间件,检查用户是否是superadmin并被模仿:

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

另外,我发现this是关于用户模仿的好文章。与我的方法类似,也有助于构建类似的东西。

答案 2 :(得分:1)

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

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