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.jsonnpm会自动获取最新的稳定版本。

你有没有尝试过直接结合他们? 就像是 :

 passport.authenticate('local', { "session": false }, function(err,user,info){ //blablabla }); 

从护照的源代码中, authenticate的定义如下:

 Authenticator.prototype.authenticate = function(strategy, options, callback) { 

所以我不明白你为什么不能使用这两个参数。