【问题标题】:Passport js authenticate by urlPassport js 通过 url 进行身份验证
【发布时间】:2015-02-19 16:41:51
【问题描述】:

我正在为我的应用程序使用 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/

但这没有用。猜猜这只是因为用户对象包含散列密码...... 有谁曾经尝试过这个并且可以告诉我它是如何工作的?

【问题讨论】:

  • passportjs.org/guide/username-password 在这里您可以找到如何使用用户名密码 stategy 登录
  • 不,我知道如何使用表单登录和注销。我希望他们能够在没有任何登录的情况下登录。他们有时会通过邮件收到一个链接,我希望他们在打开该个人链接后自动登录。所以我尝试将用户对象放入会话中,但这也不起作用......

标签: javascript node.js express passport.js


【解决方案1】:

也许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

【讨论】:

  • 好的,成功了。你让我们走上了正确的轨道。我们编辑了护照本地存储库,并根据自己的需求制定了策略。但是您使用不同策略的建议对我们很有帮助,谢谢!
  • 我把它做成了一个 npm 模块,所以你可以像普通的节点模块一样使用它:npm i passport-url
【解决方案2】:

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

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

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

上面的这个策略真的很棒,因为它意味着您可以安全地以一种受信任的方式让某人登录,而不会影响安全性或泄露密码哈希。

【讨论】:

  • 看起来很棒!!谢谢,我们将尝试将其落实到战略中。
  • 如果您正在寻找一种更自动化的方式来处理它,您可能想查看stormpath:stormpath.com(我在那里工作,我们将其作为服务提供)。太棒了^^
  • 谢谢,但我们已经实现了几乎所有的东西,所以现在从平台更改可能不是最好的主意。但是无论如何,谢谢,会看看它;)我们刚刚实现了jwt,效果很好!谢谢你的建议
【解决方案3】:

为此不需要任何额外的模块或护照策略。根据您的用例调整以下代码;

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

});

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-02-04
    • 1970-01-01
    • 1970-01-01
    • 2021-10-15
    • 2019-06-29
    • 1970-01-01
    • 1970-01-01
    • 2014-09-21
    相关资源
    最近更新 更多