当我使用passport.deserializeUser
处理程序时:
passport.deserializeUser(function(id, done) {
User.findById(id, function(err, user) {
done(err, user);
});
});
如果done
被调用err
,我是否有机会清除cookie并将用户重定向到/login
页面?该功能是否取决于我使用的策略?例如,使用failureRedirect
本地策略选项?
我使用了延续本地存储并在护照之前注册了它。
var createNamespace = require('continuation-local-storage').createNamespace;
var writer = createNamespace('express');
app.use((req,res,next) => {
namespace.bindEmitter(req);
namespace.bindEmitter(res);
namespace.run(() => {
writer.set('req', req)
writer.set('res', res);
next()
});
});
app.use(passport.initialize(), passport.session());
然后在反序列化中,您可以访问相同的命名空间并提取值:
var getNamespace = require('continuation-local-storage').getNamespace;
var reader = getNamespace('express');
function deserialize(key, done) {
try {
...
} catch(e) {
reader.get("req").logout()
}
}
你可以做的是使用 req.session.destroy
方法....所以在你的情况下:
passport.deserializeUser(function(id, done) {
User.findById(id, function(err, user) {
done(err, user);
req.session.destroy();
});
});
而且从技术上讲,这可能不会"完全"注销您应用程序中的人,因此,如果您想要替代方案,您可以使用提供的 clearCookie 方法:
passport.deserializeUser(function(id, done) {
User.findById(id, function(err, user) {
done(err, user);
req.session.destroy(function() {
res.clearCookie('connect.sid');
res.redirect('/');
});
});
});
如@amanuel2所述,您可以使用 req 来销毁会话。 如果您要求,护照将req
传递给deserializeUser
:
passport.deserializeUser(function(req, id, done) {
User.findById(id, function(err, user) {
if (err) {
req.session.destroy(function() {
return done(err)
}
}
done(null, user);
});
});
因此,如果反序列化会话出现问题,您可以销毁会话、重定向等。