我如何在节点中用Passport.js模拟另一个用户?

在Node中使用Passport.js,有没有办法让一个用户冒充另一个用户呢? 例如。 作为应用程序的pipe理员,我希望能够以其他用户的身份login,而无需知道密码。

最简单的,我会满意,如果我可以改变序列化的用户数据(用户ID),所以当deserializeUser被调用时,它将只是假设替代用户的身份。 我已经尝试更换req._passport.session.userreq._passport.session.user的值,但净效果只是我的会话似乎变得无效,护照注销我。

如果您想手动进行身份validation,Passport会提供一个req.logIn方法。 无论身份validation如何,都可以使用它来login任何用户。

以下是如何使用它。 正常pipe理员login,谁将设置isAdmin标志。

然后在passport.authenticate之前放置一个中间件,在您的loginpath中进行身份validation。 如果当前login的用户是isAdmin ,这将仅基于用户名login用户。

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

我有另一种模仿,因为:

  • 我不想弄乱authentication/护照内部的会话存储/login/等你必须了解他们真的很好,他们也容易改变,所以我会说这不是我的select。
  • 此外,我想仍然能够告诉,如果行动是从超级用户(模拟)或普通用户(未模拟)。

我所做的是:

  • 有superadminangular色模拟用户的路由,例如/superadmin/impersonate?username=normaluser1其中设置req.user.impersonated.userid = normaluser1.userid

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

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

另外,我发现这是关于用户模仿的好文章。 类似于我的方法,并且对于构build类似的东西很有启发。

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

解决这个问题的方法是编写你自己的护照authentication策略,但显然不这样做,但我假设你正在讨论使用内置策略。