当错误时清除cookie 使用护照反序列化用户.js



当我使用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);
    });
});

因此,如果反序列化会话出现问题,您可以销毁会话、重定向等。

最新更新