如何在快递+护照js注销时删除cookie?

时间:2015-10-13 20:45:33

标签: javascript node.js cookies express passport.js

我想“在退出时删除Cookie”。我无法做到这一点。我搜索了答案并找到了以下方法:

  1. 为Cookie分配新的到期日期

    res.cookie('connect.sid', '', {expires: new Date(1), path: '/' });

  2. 使用以下行删除Cookie

    res.clearCookie('connect.sid', { path: '/' });

  3. 我单独尝试了两种方法,但他们没有删除cookie。

    这是我的代码:

    routes.js

    module.exports = function(app, passport, session){
        app.get('/', function(req, res)
        {
           res.render('index.ejs');
        });
    
        app.get('/login', function(req,res){
         res.render('login.ejs',{message:req.flash('loginMessage')});
        });
    
    
        app.get('/signup',checkRedirect , function(req, res) {
            res.render('signup.ejs',{message: req.flash('signupMessage')});
        });
        app.get('/profile', isLoggedIn, function(req,res) {
            res.render('profile.ejs', {
                user :req.user
            });
        });
        app.post('/signup', passport.authenticate('local-signup', {
            successRedirect : '/profile',
            failureRedirect : '/signup',
            failureFlash : true
        }));
        app.post('/login',  passport.authenticate('local-login', {
    
            successRedirect : '/profile',
            failureRedirect : '/login',
            failureFlash :true
    
        }));
    app.get('/logout',function(req,res){
        res.cookie('connect.sid', '', {expires: new Date(1), path: '/' });
       req.logOut();
        res.clearCookie('connect.sid', { path: '/' });
        res.redirect('/');
    });
    
    function isLoggedIn(req, res, next){
    
        if(req.isAuthenticated())
          return next();
    
        console.log("hiii");
        res.redirect('/');
    }
    

    };

    server.js

        var express = require('express');
    var app = express();
    var port = process.env.PORT || 3000;
    var mongoose = require('mongoose');
    var passport = require('passport');
    var flash=require('connect-flash');
    var morgan=require('morgan');
    var bodyParser = require('body-parser');
    var cookieParser=require('cookie-parser');
    //
    var session=require('express-session');
    var RedisStore = require('connect-redis')(session);
    var redis   = require("redis");
    var redis_client  = redis.createClient();
    app.use(bodyParser.json());
    app.use(bodyParser.urlencoded({extended: true}));
    var configDb=require('./config/database.js');
    mongoose.connect(configDb.url);
    
    require('./config/passport')(passport);
    
    app.use(morgan('dev'));
    app.use(cookieParser());
    app.use(bodyParser());
    app.set('view engine', 'ejs');
    
    
    app.use(session({
        store: new RedisStore({
        host: '127.0.0.1',
        port: 6379,
        client: redis_client
    }),
        secret : 'foo',
        resave: false,
        saveUninitialized: false
    }));
    app.use(function (req, res, next) {
        if (!req.session) {
            return next(new Error('oh no')); // handle error
        }
        next();
    });
    
    
    });
    
    app.use(passport.initialize());
    app.use(passport.session());
    app.use(flash());
    
    require('./app/routes')(app, passport, session);
    app.listen(port, function(){
        console.log('server is at port' + port);
    });
    

6 个答案:

答案 0 :(得分:2)

您可以在注销路由中使用req.session.destroy来销毁下面的会话是参考代码:)

app.get('/logout', function(req,res){
 req.logOut();
 req.session.destroy(function (err) {
        res.redirect('/'); //Inside a callback… bulletproof!
    });
});

答案 1 :(得分:1)

请试试这个:

router.get('/logout', function (req, res) {
  req.logOut();
  res.status(200).clearCookie('connect.sid', {
    path: '/'
  });
  req.session.destroy(function (err) {
    res.redirect('/');
  });
});

答案 2 :(得分:1)

我自己一直在努力解决这个问题。以前,我尝试过logoutsession.destroy,但都没有一个适合我。然后,我用clearCookie附加项找到了以上答案,就可以了。

但是,我想知道这些功能是否完全有效,因为如果没有clearCookie,这些功能就不会起作用。所以我省略了它们。

此外,由于status(200)redirect覆盖(将状态设置为302),我想我也忽略了。

关于Will59's solutionclearCookie的选项,无论如何它们似乎都是默认值,所以我也尝试省略它们。

我最终得到了下面两行代码。他们为我使用了Chrome,Firefox和Safari(撰写本文时为最新版本)。

router.get('/logout', function (req, res) {
  res.clearCookie('connect.sid');
  res.redirect('/');
});

答案 3 :(得分:1)

res.clearCookies 有点乱。作为替代方法,使用您最初用于创建 cookie 的任何选项再次调用 res.cookie,连同 expires: new Date(1),如下所示:

// Use the same httpOnly, secure, sameSite settings to "delete" the cookie
res.cookie("jwt", "", {
    httpOnly: true, 
    secure: true,
    sameSite: "none",    
    expires: new Date(1)
});

本质上,您是用一个立即过期的新 cookie 替换旧 cookie。

答案 4 :(得分:0)

所以这里没有任何建议对我有用,直到我意识到我做了一个蠢话:

使用Github,我设置了一个OAuth应用程序(您可以在配置文件设置中执行此操作),并将其用于身份验证。

工作了一个魅力!但即使我从我的应用程序退出,它也总是向我发送相同的个人资料。清除所有浏览器存储并没有修复它。

然后我突然意识到我仍然登录到我的github帐户(这是我一直得到的配置文件)...一旦我退出,然后OAuth应用程序再次提示我输入我的用户/ pw

答案 5 :(得分:0)

对我来说,pjiaquan不能与铬配合使用,饼干仍然存在。 问题来自于{。{3}}中所述的res.clearCookie方法:

仅当给定的选项与res.cookie()相同时,Web浏览器和其他兼容客户端才会清除cookie,但expires和maxAge除外。

对于我来说,解决方案最终是:

router.get('/logout', function (req, res) {
  req.logOut();
  res.status(200).clearCookie('connect.sid', {
    path: '/',
    secure: false,
    httpOnly: false,
    domain: 'place.your.domain.name.here.com',
    sameSite: true,
  });
  req.session.destroy(function (err) {
    res.redirect('/');
  });
});