Passport js 通过 url 进行身份验证

Passport js authenticate by url

我正在为我的应用程序使用 Express JS 和 Passport JS。

我想让新用户有机会通过特定 URL 自动登录一次。我可以使用 URL 中的信息从数据库中获取用户,所以我有一个用户对象(带有 ID、电子邮件、散列密码等),但我不知道如何使用护照来验证用户和登录。

我尝试使用从数据库中获取的用户对象执行以下函数:

req.login(user, function(err) {
  if (err) { return next(err); }
  return res.redirect('/users/' + req.user.username);
});

来源:http://passportjs.org/guide/login/

但这没有用。猜猜这只是因为用户对象包含散列密码...... 谁以前试过这个,能告诉我它是如何工作的吗?

也许https://github.com/yarax/passport-url攻略对你有用

基本逻辑正在从 url

获取参数
UrlStrategy.prototype.authenticate = function(req, options) {
    var self = this;

    function verified(err, user, info) {
        if (err) { return self.redirect(self.failRedirect); } // redirect in fail
        self.success(user, info); // done callback
    }

    this._verify(req.query[this.varName], verified);
};

这里有完整的例子https://github.com/yarax/passport-url/blob/master/index.js

嗨,虽然@Rax Wunter 是完全正确的,但我刚刚看到这个问题并想说做你在这里做的事情不是一个好主意。您永远不应该在 URL 字符串中传递散列密码。这是一个非常糟糕的安全问题。

你应该做的是使用类似 JSON Web Token (JWT) 的东西。有很多库可以帮助解决这个问题,但基本流程是这样的:

  • 无论您在哪里生成 URL,您都会生成一个包含用户 ID 的 JWT。
  • 然后您将构建一个 URL,如下所示:https://somesite.com/?token=
  • 在您的 https://somesite.com 端点上,您将读入令牌,使用 JWT 库(和共享秘密变量)对其进行验证,这将确认该令牌未被修改(例如:您知道这个用户是他们自称的人)。

上面的策略非常棒,因为它意味着您可以安全地 以受信任的方式让某人登录,而不会危及安全性或根本不会泄露密码哈希值。

不需要任何额外的模块或通行证策略。根据您的用例调整以下代码;

router.get('/url/:token', (req, res) => {
  User.findOne({token: req.params.token}, (err, user) => {
      req.login(user, {}, function(err) {
          if (err) { console.error(err); }
          else return res.redirect("/home.html");
      });
  });

});