【发布时间】:2021-01-05 05:22:58
【问题描述】:
我已经在 express 和 express-session 和 express-sql-session 方面取得了相当大的进展。当用户登录时,我已经在数据库中为会话创建了一行。这就是我设置它的方式:
//login route handler
this.bcrypt.compare(password, row.hashed, function(err, passwordsMatch) {
if (passwordsMatch === true) {
console.log("user now logged in");
req.session.user = row;
req.session.success = 'User successfully logged in';
res.send(row);
res.end();
}
});
多莉!我可以跳入我的会话表并从数据库中获取行。这里是:
{"cookie":{"originalMaxAge":600000,"expires":"2015-08-24T23:16:20.079Z","httpOnly":false,"path":"/"},
"user":{"userID":24,"userName":"g","email":"g","joinDate":"2015-08-24T07:15:33.000Z"},"success":"User successfully logged in"}
请注意,您可以看到自定义使用对象已设置。但是,在下一个获取数据的请求中,我会检查会话中的 user 对象:
// some other route called after login.
if (!req.session.user) {
console.log('user not authorized' + JSON.stringify(req.session));
res.send('not authorized');
return;
}
但这会记录一个(显然)空会话。
user not authorized{"cookie":{"originalMaxAge":600000,"expires":"2015-08-24T23:27:13.455Z","httpOnly":false,"path":"/"}}
进入浏览器,我还看到资源面板中没有设置 cookie。这不应该用 express 4 和 session 自动生成吗?文档说您不再需要 expressCookie() 和 express 4。如何在后续请求中获得正确的会话?
另外,如果我再次登录,它只会在会话表中创建一个重复的行。 如何在响应中正确设置 cookie 以使其适用于下一个请求?
如果有帮助,这是我的会话配置:
// at the beginning of my node server
import express = require('express');
import bodyParser = require('body-parser');
import Q = require('q');
import mysql = require('mysql');
var app = express();
import bcrypt = require('bcrypt');
import userModule = require('./userModule')
var UserRepository = new userModule.UserNamespace.UserRepository(connectToMySQL, bcrypt, Q );
import session = require('express-session');
var SessionStore = require('express-sql-session')(session);
app.use(function (req, res, next) {
res.header("Access-Control-Allow-Origin", "*");
res.header('Access-Control-Allow-Credentials', 'true');
res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
next();
});
app.use(bodyParser.urlencoded({ extended: false }))
app.use(bodyParser.json())
var storeOptions = {
client: 'mysql',
connection: {
host:SQLHOST,
port:SQLPORT,
user:SQLUSER,
password: SQLPASS,
database: SQLDB
},
table: SESSION_TABLE,
expires: 365 * 24 * 60 * 60 * 1000
};
var sessionStore = new SessionStore( storeOptions );
app.use(session({
secret: 'meeogog',
resave: false,
saveUninitialized: false,
cookie: { maxAge: 600000,httpOnly: false },
store: sessionStore
}));
...
app.post('/users/login/', function (req, res) {
UserRepository.loginHashed(req, res);
});
..and then more routes, and so forth
【问题讨论】:
-
两个建议:
res.end()在res.send(row)之后是不必要的,您可能会显示更完整的代码(例如在app.use(session(...))之后发生的情况),因此我们可以看到您发布的各种代码 sn-ps 在哪里执行的时间和顺序。 -
这两个业务 sn-ps 来自路由处理程序(我已经返回并标记为这样)。我不认为在这里添加数据库检索代码会有多大用处。我只是在阅读后才尝试 .end() ,有时在 .send() 之后可能会在其他地方或其他地方出现竞争条件。我觉得我只是在这里错过了一大块饼干没有设置好。
-
我添加了其余的初始化代码,看看我是否只是缺少一些配置或其他库或其他东西。
-
@FlavorScape - 你看过下面的问题cookie.expires goes back to original value on each request吗?这可能与您遇到的问题不完全相同,但似乎有一些关于如何设置或不设置
maxAge的信息,而是设置expire。还要检查配置属性rolling、resave和saveUninitialized。当然在你的情况下saveUninitialized设置为false似乎完全有意义,因为你没有修改你的会话数据,你只在成功登录后写一次。还是我错了?
标签: javascript node.js session cookies express