【问题标题】:session value is not stored properly会话值未正确存储
【发布时间】:2021-08-30 18:06:21
【问题描述】:

我在我的应用程序中使用 express-session 和 express-mysql-session 来生成会话并将它们存储在 mysql 数据库中。会话存储在一个名为会话的表中。

const express = require('express');
const session = require('express-session');
const MySQLStore = require('express-mysql-session')(session);
const cookieParser = require('cookie-parser');

const connection = {
  host: process.env.MYSQL_HOST,
  port: process.env.MYSQL_PORT,
  user: process.env.MYSQL_USER,
  password: process.env.MYSQL_PASSWORD,
  database: process.env.MYSQL_DATABASE,
};

const sessionStore = new MySQLStore(connection);

module.exports = app => {
  app.use(express.json());
  app.use(express.urlencoded({ extended: false }));
  app.use(cookieParser());
  app.use(
    session({
      name: 'sessID',
      secret: 'someSecret',
      resave: false,
      store: sessionStore,
      saveUninitialized: true,
    })
  );

会话存储在表中,但它的值与客户端或控制台中的会话值不同。 示例:客户端和控制台中的解码值为s:fiNdSdb2_K6qUB_j3OAqhGLEXdWpZkK4.eKUawMNIv7ZtXSweWyIEpfAUnfRd6/rPWr+PsjuGCVQ,但存储的值为fiNdSdb2_K6qUB_j3OAqhGLEXdWpZkK4。它不完整,我不知道发生了什么。

显示创建表会话:

sessions    CREATE TABLE `sessions` (
`session_id` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin 
 NOT NULL,
 `expires` int unsigned NOT NULL,
 `data` mediumtext CHARACTER SET utf8mb4 COLLATE utf8mb4_bin,
 PRIMARY KEY (`session_id`)
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci 

【问题讨论】:

  • 运行SHOW CREATE TABLE sessions并发布结果into your question
  • @FaNo_FN 更新了我的问题
  • 对不起,我的无知,这是我第一次看到这个,但似乎我对SHOW CREATE TABLE sessions 的请求实际上是不必要的。我刚刚read the documentation,我可以看到该表是由模块创建的。请问你是怎么知道存储不完整的?您是否通过在 MySQL 工具(例如 MySQL Workbench 或 SQLyog)中运行查询来进行检查?
  • @FaNo_FN 没关系。我想验证用户输入,所以我决定将错误存储在数据列中(以防出现错误)。因此,我需要将请求的会话值与数据库中的 session_id 匹配。我运行查询以查看 session_id 并尝试与客户端会话值匹配,但它不一样,我认为它可能是 express-mysql-session。如果它不起作用,我必须使用另一个模块。

标签: javascript mysql node.js express express-session


【解决方案1】:

存储在客户端 cookie 中的值由两部分组成:

  1. 实际会话 ID(在您的示例中为 fiNdSdb2_K6qUB_j3OAqhGLEXdWpZkK4
  2. 服务器生成的会话 ID eKUawMNIv7ZtXSweWyIEpfAUnfRd6/rPWr+PsjuGCVQ 的 HMAC 签名。这是为了确保会话 ID 的完整性,并且不需要存储在数据库中。它是由express-session(内部使用node-cookie-signature package)并使用传递的secret 参数在服务器端生成的。

因此,express-session 使用 cookie 名称的第二部分(点之后)来验证第一部分,然后将其剥离。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-05-18
    • 1970-01-01
    • 2011-10-03
    • 1970-01-01
    • 1970-01-01
    • 2013-09-11
    • 2016-06-08
    • 1970-01-01
    相关资源
    最近更新 更多