我正在为我的应用程序使用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/
但那并没有奏效。猜测它只是因为用户对象包含散列密码... 以前试过这个的人可以告诉我它是如何工作的吗?
答案 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)
你应该做的是使用类似JSON Web Token(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");
});
});
});