PassportJS – 自定义callback并将Session设置为false
是否有可能使用自定义callback和禁用会话? 在文档中,它显示了如何禁用会话和自定义callback,但我如何将它们合并?
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);
function。
所以基本上你想在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(); } }
PS请考虑使用npm install [package-name] --save
来安装npm
依赖关系,而不是手动创buildpackage.json
。 npm
会自动获取最新的稳定版本。
你有没有尝试过直接结合他们? 就像是 :
passport.authenticate('local', { "session": false }, function(err,user,info){ //blablabla });
从护照的源代码中, authenticate
的定义如下:
Authenticator.prototype.authenticate = function(strategy, options, callback) {
所以我不明白你为什么不能使用这两个参数。