在 Express 中更新 cookie 会话,但未在浏览器中注册

2023-12-05

我已经设置了一个工作登录测试,如下所示:

var express = require('express');
var fs = require('fs');
var http = require('http');
var path = require('path');
var routes = require('./routes/index.coffee');
var passport = require('passport');

var LocalStrategy = require('passport-local').Strategy;
var User = require('./userdb.coffee');
var app = express();
var RedisStore = require('connect-redis')(express);

passport.use(new LocalStrategy(function(username, password, done) {
  return User.findOne({
    username: username
  }, function(err, user) {
    if (err) {
      return done(null, false, message: error);
    }
    if (!user) {
      return done(null, false, {
        message: 'Unknown user'
      });
    }
    if (!user.validPassword(password)) {
      return done(null, false, {
        message: 'Invalid password'
      });
    } else {
      return done(null, user);
    }
  });
}));

passport.serializeUser(function(user, done) {
  return done(null, user);
});

passport.deserializeUser(function(user, done) {
  return done(null, user);
});

app.configure(function() {
  app.set('port', process.env.PORT || 5003);
  app.set('views', __dirname + '/views');
  app.set('view engine', 'jade');
  app.enable('trust proxy');
  app.use(express["static"](path.join(__dirname, 'public')));
  app.use(express.bodyParser());
  app.use(express.methodOverride());
  app.use(express.cookieParser('SOMESECRET'));
  app.use(express.session({
    cookie: {
      maxAge: 10 * 60 * 1000
    },
    key: 'express.sid',
    secret: 'SOMESECRET',
    store: new RedisStore({
      port: 6379,
      host: 'localhost'
    })
  }));
  app.use(passport.initialize());
  app.use(passport.session());
  return app.use(app.router);
});

var check_auth = function(req, res, next) {
  if (req.isAuthenticated()) {
    console.log(req.session.cookie.expires);
    return next();
  }
  return res.redirect('/login');
};

app.get('/', check_auth, routes.index);
app.get('/login', routes.login);
app.get('/logout', routes.logout);
app.post('/authenticate', passport.authenticate('local', {
  successRedirect: '/',
  failureRedirect: '/login'
}));

app.listen(app.get('port'), '0.0.0.0');

路线和用户逻辑被省略,因为我认为它们与我的问题无关,但如果需要的话我会很乐意分享它们(它们非常小,这只是为了启动和运行一个小的概念证明) 。

登录有效,读取会话有效,基于会话值呈现模板有效。 我的问题是 maxAge/expires。我不确定问题出在哪里,但我会尝试描述它:

当我登录时,会话保存为passport.js,正确存储在我的RedisStore,并且指向会话的 cookie 返回给浏览器。 在后续请求中,成功找到 cookie 并指向我的正确会话SessionStore. req.session.cookie显示更新的expires并在我的redis服务器,TTL 重置为 10 分钟 (600)。

我的问题是 cookie 在浏览器(Chrome、Windows 和 Mac)中保持相同的有效期。

所以我的问题是: 我该如何进一步调试? 随着 req.session 的更新(通过express, passport and connect-redis内部/自动),我想知道问题出在哪里,以及我应该做什么来解决这个问题:Cookie 保持初始 maxAges/expires.

任何提示、指示或想法都将不胜感激。


Express-session 支持滚动 cookie 过期日期。不幸的是,直到最近才被记录下来。

对您的会话使用“滚动”选项。这“强制在每个响应上设置 cookie”并“重置过期日期”。您想将滚动设置为 true。

还要注意“重新保存”选项。 “即使未修改也强制保存会话......”您可能也希望将该选项设置为 true。请注意,即使此选项的默认值为 true,您也应该显式设置该值。现在已弃用依赖此选项的默认值而不是显式设置它。

尝试类似的方法:

app.use( session( { secret: 'keyboard cat',
                    cookie: { maxAge: 60000 },
                    rolling: true,
                    resave: true, 
                    saveUninitialized: false
                  }
         )
);

这是文档。查看“选项”和“options.resave”:https://github.com/expressjs/session .

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Express 中更新 cookie 会话,但未在浏览器中注册 的相关文章

随机推荐

  • R:基于多个变量的多个值的子数据框

    我需要从第一个数据集 称为df1此处 基于与第二个数据集匹配的特定日期 ID 事件开始时间和事件结束时间的组合 df2 当只有 1 个日期 ID 以及事件开始和结束时间时 一切正常 但数据集之间的某些匹配记录包含多个 ID 日期或时间 并且
  • 为什么 nginx 找不到我的资产?

    我使用的是 Rails 3 2 我的生产设置使用 nginx 和 unicorn 我对名为 sidekiq 的 ruby gem 使用的某些资产有疑问 然而 当我请求这些资产时 这些资产没有得到正确的服务 我的 nginx 配置如下所示 u
  • 如何在 C# 中创建自定义属性

    任何人都可以向我解释一个带有代码的自定义属性的非常基本的示例吗 首先编写一个派生自的类属性 public class MyCustomAttribute Attribute public string SomeProperty get se
  • 使用 NSTask 的 Swift 2.1 OSx shell 命令在从 xcode 运行时有效,但在导出时无效

    我编写了一个简单的 OSx 10 11 应用程序 以便在按下按钮时执行 shell 命令 当我从 xcode 运行它时它可以工作 但是当我通过 存档 导出应用程序时 其中一个按钮不再工作 我没有收到错误 也没有得到任何输出 我使用的是绝对路
  • 如何选择和提取两个元素之间的文本?

    我正在尝试刮this使用scrapy的网站 页面结构如下所示 div class list a a h4 class li group Follows h4 div class soda odd a href Star Trek a div
  • 如何将Matlab中的数据导出到excel循环?

    我有一个 for循环 的代码 对于我 1 4 陈述 y sim 净 我 结尾 现在我需要将 y 的值导出到 Excel 工作表 为此我用了 xlswrite 输出数据 xls y 输出数据 A1 但我的问题是excel的ID 即 A1 应该
  • 使用 PDFBox 生成的 PDF 为空白

    我在尝试着将内容写入 PDF文件 我已经写了代码 public ByteArrayOutputStream createPDF String text throws IOException COSVisitorException PDDoc
  • 在 python 中使用 asyncio 运行多个套接字

    设置 Python 3 7 4 我正在尝试使用 asyncio 在不同端口上侦听来创建 6 个套接字 我尝试像这样实现它 Code import asyncio async def client thread reader writer w
  • 切换路由时组件中的非作用域样式仅应用一次

    Vue js 作用域 CSS 文档提到 您可以在同一组件中包含作用域样式和非作用域样式 我建造了示例应用程序vue router并使用两个单个文件组件而不是示例的字符串模板 渲染符合预期 然后 我尝试在组件中应用作用域样式和非作用域样式 在
  • 为每个用户创建个人页面,PHP

    我想要做的是为每个在我的页面上注册的用户创建一个网页 例如 www someweb com 用户名 这将是他们的网页 我知道这可以很容易地完成mkdir 和其他相关功能 但问题是我的根文件夹不是chmod 777我不想chmod 777由于
  • Highcharts 工具提示背景根据线

    我正在尝试使用 Highcharts 使工具提示的背景颜色与线条的颜色相匹配 我正在尝试找到最合理的本机方法来处理这个问题 如果可以避免添加 div div 格式化程序有背景颜色 那就太好了 但如果没有 我想这也有效 线条颜色和数量会发生很
  • 测试移动网站[关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心以获得指导 我们正准备推出一个移动网站
  • 使用 XmlReader.Create(uri) 防止或处理超时

    有时 我在通过 URL 读取 XML 时会遇到超时异常 我可以采取什么措施来防止这种情况发生 还是远程服务器有问题 下面是我的简单代码 XmlDocument doc new XmlDocument doc Load XmlReader C
  • 带有 mod_wsgi 的 Django 返回 403 错误

    我正在尝试将 Django 与 Apache 和 mod wsgi 一起使用 使用默认的 Django Web 服务器 一切进展顺利 但现在在尝试加载页面时出现 403 访问禁止 错误 我在这里搜索了以前的帖子并阅读了官方文档 但那里的解决
  • 是否可以在opengl中使用深度缓冲区渲染3D纹理

    我正在尝试实现一些程序并使用这个经典代码 glBindFramebuffer GL FRAMEBUFFER framebuffer 绑定深度缓冲区 glGenRenderbuffers 1 depthbuffer glBindRenderb
  • jQuery 将 HTML 表转换为 XML

    我使用以下 jQuery 代码从远程主机检索 HTML var loadUrl URL html result html ajax load load loadUrl table schedule 这给了我以下 HTML table cla
  • 项目文件存储在 git 存储库“.git”文件夹中的哪里? [复制]

    这个问题在这里已经有答案了 我为我的许多项目创建了一个远程存储库 因此它是我的目标push的 与 git 的理念相反 但它充当中央存储库 然而当我去 git服务器上的文件夹有以下形式的目录结构 branches hooks applypat
  • Ember JS 的可重用组件/视图

    我正在尝试创建一个可重用的组件或视图 用于创建包含在 Bootstrap 控制组中的标签和文本输入 该组件需要创建如下内容 div class control group div
  • 如何修复 InvalidStateError:没有远程 SDP 时无法添加 ICE 候选者

    我正在创建一个 webRTC 视频聊天 当从 Firefox 发起呼叫时显示呼叫者所有活动成员 并且接收者使用 chrome 此错误显示 未捕获 承诺 DOMException 无法在 RTCPeerConnection 上执行 addIc
  • 在 Express 中更新 cookie 会话,但未在浏览器中注册

    我已经设置了一个工作登录测试 如下所示 var express require express var fs require fs var http require http var path require path var routes