会话值未正确存储
session value is not stored properly
我在我的应用程序中使用 express-session 和 express-mysql-session 来生成会话并将它们存储在 mysql 数据库中。会话存储在一个名为 session.
的 table 中
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,
})
);
会话存储在table中,但它的值与客户端或控制台中的会话值不同。
示例:在客户端和控制台中解码的值为s:fiNdSdb2_K6qUB_j3OAqhGLEXdWpZkK4.eKUawMNIv7ZtXSweWyIEpfAUnfRd6/rPWr+PsjuGCVQ
,但存储的值为fiNdSdb2_K6qUB_j3OAqhGLEXdWpZkK4
。不完整,我不知道发生了什么。
显示创建 TABLE 个会话:
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
存储在客户端 cookie 上的值由两部分组成:
- 实际会话 ID(在您的示例中为
fiNdSdb2_K6qUB_j3OAqhGLEXdWpZkK4
)
- 服务器生成的会话 ID
eKUawMNIv7ZtXSweWyIEpfAUnfRd6/rPWr+PsjuGCVQ
的 HMAC 签名。这是为了确保会话 ID 的完整性,不需要存储在数据库中。它由 express-session
(在内部使用 node-cookie-signature
package)并使用传递的 secret
参数在服务器端生成。
因此 express-session
使用 cookie 名称的第二部分(点之后)来验证第一部分,然后将其删除。
我在我的应用程序中使用 express-session 和 express-mysql-session 来生成会话并将它们存储在 mysql 数据库中。会话存储在一个名为 session.
的 table 中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,
})
);
会话存储在table中,但它的值与客户端或控制台中的会话值不同。
示例:在客户端和控制台中解码的值为s:fiNdSdb2_K6qUB_j3OAqhGLEXdWpZkK4.eKUawMNIv7ZtXSweWyIEpfAUnfRd6/rPWr+PsjuGCVQ
,但存储的值为fiNdSdb2_K6qUB_j3OAqhGLEXdWpZkK4
。不完整,我不知道发生了什么。
显示创建 TABLE 个会话:
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
存储在客户端 cookie 上的值由两部分组成:
- 实际会话 ID(在您的示例中为
fiNdSdb2_K6qUB_j3OAqhGLEXdWpZkK4
) - 服务器生成的会话 ID
eKUawMNIv7ZtXSweWyIEpfAUnfRd6/rPWr+PsjuGCVQ
的 HMAC 签名。这是为了确保会话 ID 的完整性,不需要存储在数据库中。它由express-session
(在内部使用node-cookie-signature
package)并使用传递的secret
参数在服务器端生成。
因此 express-session
使用 cookie 名称的第二部分(点之后)来验证第一部分,然后将其删除。