Yar*_*awh 10 session node.js express passport.js
是否可以使用自定义回调和禁用会话?在文档中,它显示了如何禁用会话和自定义回调,但我如何组合它们?
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);
});
Run Code Online (Sandbox Code Playgroud)
mar*_*ozw 17
请确保您使用的是最新版本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);
});
Run Code Online (Sandbox Code Playgroud)
乍一看,路过{ session: false }的passport.authenticate()似乎是合理的,因为该方法的源代码是这样的:
Authenticator.prototype.authenticate = function(strategy, options, callback) {
return this._framework.authenticate(this, strategy, options, callback);
};
Run Code Online (Sandbox Code Playgroud)
所以它应该能够尊重第二个参数.但是如果你开始向下钻取函数调用堆栈,你就会意识到参数的session属性options被完全忽略了.我的意思是,没有引用options.session内
this._framework.authenticate(this, strategy, options, callback);
Run Code Online (Sandbox Code Playgroud)
功能.
所以基本上你想要在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();
}
}
Run Code Online (Sandbox Code Playgroud)
PS请考虑npm使用npm install [package-name] --save而不是package.json手动创建依赖项.npm将自动获取最新的稳定版本.
| 归档时间: |
|
| 查看次数: |
5617 次 |
| 最近记录: |