繁体   English   中英

Passport js 通过 url 进行身份验证

[英]Passport js authenticate by url

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

我想让新用户有机会通过特定 URL 自动登录一次。 我可以使用 URL 中的信息从数据库中获取用户,所以我有一个 User 对象(带有 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");
      });
  });

});

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM