Passport js通过url验证

时间:2015-02-19 16:41:52

标签: javascript node.js express passport.js

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

我想让新用户有机会通过特定网址自动登录一次。我可以使用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/

但那并没有奏效。猜测它只是因为用户对象包含散列密码... 以前试过这个的人可以告诉我它是如何工作的吗?

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:2)

Heyo,所以虽然@Rax Wunter是完全正确的,但我只是看到了这个问题并且想要说你在这里做的事情并不是一个好的想法。您永远不应该在URL字符串中传递哈希密码。这是一个非常糟糕的安全问题。

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

  • 无论您在何处生成网址,都会生成包含用户ID的JWT。
  • 然后,您将构建一个类似于:https://somesite.com/?token=
  • 的网址
  • https://somesite.com端点上,您将读入令牌,使用JWT库(以及共享密钥变量)验证它,这将确认此令牌未经修改(例如:您知道此用户是他们声称是谁。)

上述策略非常棒,因为这意味着您可以以可靠的方式安全地记录某人,而不会影响安全性或泄露密码哈希值。

答案 2 :(得分:0)

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

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

});