如何在生产中设置快速会话。快速会话在 https 中不起作用

Posted

技术标签:

【中文标题】如何在生产中设置快速会话。快速会话在 https 中不起作用【英文标题】:How to set up express-session in production. Express-session is not working in https 【发布时间】:2020-04-28 20:34:37 【问题描述】:

我使用 express-session 和 connect-mongo 来存储会话,它在开发环境中运行良好。但是,它不是在生产中持久化会话。当我登录时,我可以通过console.log(req.sesssion) 在服务器上获取会话。但是,如果我移动到另一个 url,会话是未定义的。

const whitelist = ['https://example.com', 'https://www.example.com'];
const corsOptions = 
  origin(origin, callback) 
    if (whitelist.indexOf(origin) !== -1) 
      callback(null, true);
     else 
      callback(new Error('Not allowed by CORS'));
    
  
;
app.use(cors(corsOptions));
app.use(session(
  secret: 'keyboard cat',
  resave: false,
  saveUninitialized: true,
  store,
));

【问题讨论】:

【参考方案1】:

在寻找答案后,我花了大约一天的时间。最后,我发现了引起所有头痛的问题。该问题与http请求有关。我在请求中使用axios,默认情况下,Axios 不会获取发送或接收任何 cookie。为了能够使用 cookie,我需要为我发出的每个请求传递 Axios 配置选项。withCredentials: true。感谢post author。

Axios.post(url, data,  withCredentials: true )...

但是,这让我想到了另一个问题。

""Access-Control-Allow-Credentials" 标头的值 响应为 '' ,当请求的凭据时必须为 'true' 模式是“包含”。”

然后我将 credentials: true 添加到我的 cors() 模块 like so。

const corsOptions = 
  origin(origin, callback) 
    if (whitelist.indexOf(origin) !== -1) 
      callback(null, true);
     else 
      callback(new Error('Not allowed by CORS'));
    
  ,
  credentials: true
;

现在我的项目已经上线并为用户提供服务,让他们的生活更轻松:)。

【讨论】:

以上是关于如何在生产中设置快速会话。快速会话在 https 中不起作用的主要内容,如果未能解决你的问题,请参考以下文章

如何快速保持会话

NodeJS、VueJS、快速会话。 cookie 不在客户端设置

如何手动重新加载 Passport 快速会话存储

使用 AngularJS 进行快速会话

NodeJS express - 如何在路由器内添加会话数据?

用于快速会话的 Ephemeral 和 MaxAge