会话值未正确存储

时间:2021-06-14 20:39:15

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

我在我的应用程序中使用 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 

1 个答案:

答案 0 :(得分:1)

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

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

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