使用 passport.js 反序列化用户错误时如何清除 cookie?
How to clear cookies when error deserialize a user using passport.js?
当我使用 passport.deserializeUser
处理程序时:
passport.deserializeUser(function(id, done) {
User.findById(id, function(err, user) {
done(err, user);
});
});
如果使用 err
调用 done
,我是否有机会清除 cookie 并将用户重定向到 /login
页面?该功能是否取决于我使用的策略?例如。使用本地策略的 failureRedirect
选项?
你可以做的是使用 req.session.destroy
方法....所以在你的情况下:
passport.deserializeUser(function(id, done) {
User.findById(id, function(err, user) {
done(err, user);
req.session.destroy();
});
});
而且技术上可能不会 "Fully" 在您的应用程序中注销此人,因此如果您想要替代方法,可以使用提供的 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('/');
});
});
});
我用过continuation local storage,在passport前注册过
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()
}
}
就像@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);
});
});
因此,如果反序列化会话出现问题,您可以销毁会话、重定向等。
当我使用 passport.deserializeUser
处理程序时:
passport.deserializeUser(function(id, done) {
User.findById(id, function(err, user) {
done(err, user);
});
});
如果使用 err
调用 done
,我是否有机会清除 cookie 并将用户重定向到 /login
页面?该功能是否取决于我使用的策略?例如。使用本地策略的 failureRedirect
选项?
你可以做的是使用 req.session.destroy
方法....所以在你的情况下:
passport.deserializeUser(function(id, done) {
User.findById(id, function(err, user) {
done(err, user);
req.session.destroy();
});
});
而且技术上可能不会 "Fully" 在您的应用程序中注销此人,因此如果您想要替代方法,可以使用提供的 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('/');
});
});
});
我用过continuation local storage,在passport前注册过
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()
}
}
就像@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);
});
});
因此,如果反序列化会话出现问题,您可以销毁会话、重定向等。