gpt4 book ai didi

node.js - PassportJS - 自定义回调并将 Session 设置为 false

转载 作者:IT老高 更新时间:2023-10-28 23:18:45 25 4
gpt4 key购买 nike

是否可以使用自定义回调并禁用 session ?在文档中,它显示了如何禁用 session 和自定义回调,但我如何组合它们?

app.get('/login', function(req, res, next) {
passport.authenticate('local', function(err, user, info) {
if (err) { return next(err); }
if (!user) { return res.redirect('/login'); }

req.logIn(user, function(err) {

// I'm getting an error here
// [Error: Failed to serialize user into session]

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

最佳答案

请确保您使用最新版本的 passport(今天是 0.2.1)。

请尝试将 { session: false } 作为 req.logIn() 函数的第二个参数传递:

app.get('/login', function (req, res, next) {
passport.authenticate('local', function (err, user, info) {
if (err) { return next(err); }
if (!user) { return res.redirect('/login'); }

req.logIn(user, { session: false }, function (err) {

// Should not cause any errors

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

原因:

乍一看,在 passport.authenticate() 中传递 { session: false } 似乎是合理的,因为该方法的源代码如下所示:

Authenticator.prototype.authenticate = function(strategy, options, callback) {
return this._framework.authenticate(this, strategy, options, callback);
};

所以它应该能够尊重第二个参数。但是,如果您开始深入了解函数调用堆栈,您会发现 options 参数的 session 属性被完全忽略了。我的意思是,里面没有对 options.session 的引用

this._framework.authenticate(this, strategy, options, callback);

功能。

所以基本上你想在 req.logIn() 函数中传递它。该函数源码如下:

req.logIn = function(user, options, done) {
if (!this._passport) throw new Error('passport.initialize() middleware not in use');

if (!done && typeof options === 'function') {
done = options;
options = {};
}
options = options || {};
var property = this._passport.instance._userProperty || 'user';
var session = (options.session === undefined) ? true : options.session;

this[property] = user;
if (session) { // HERE! It will not try to serialize anything if you pass {session: false}
var self = this;
this._passport.instance.serializeUser(user, function(err, obj) {
if (err) { self[property] = null; return done(err); }
self._passport.session.user = obj;
done();
});
} else {
done && done();
}
}

附:请考虑使用 npm install [package-name] --save 安装您的 npm 依赖项,而不是手动创建 package.jsonnpm 会自动获取最新的稳定版本。

关于node.js - PassportJS - 自定义回调并将 Session 设置为 false,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25171231/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com