Экспресс-сессия создает новые куки для каждого запроса
Поэтому я создаю приложение с угловым на передней панели и nodejs/express на внутренней стороне. Моя проблема в том, что при использовании экспресс-сессии каждый запрос создает новый сеансовый файл cookie.
Я перебрал много вопросов и ответов, но кажется, что большинство вопросов, на которые были даны ответы, - это вопросы, касающиеся Express 3.x, и я использую Express 4.x.
Вот код, над которым я работаю:
var bcrypt = require('bcrypt');
var express = require('express');
var mongoose = require('mongoose');
var bodyParser = require('body-parser');
var session = require('express-session');
var dbSchemas = require('./database-schemas.js');
var userDB = require('./UserDatabaseQuery');
var MongoDBStore = require('connect-mongodb-session')(session);
var cookieParser = require('cookie-parser');
var app = express();
var store = new MongoDBStore({
uri: 'mongodb://localhost:27017/connect_mongodb_session',
collection: 'mySessions'
});
mongoose.connect('mongodb://localhost/dbSPPM');
var db = mongoose.connection;
var Schema = mongoose.Schema;
var SALT_WORK_FACTOR = 10;
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({
extended: true
}));
app.use(cookieParser());
app.use(session({
secret: 'th3s3cr3tc0d30fd00m',
cookie: {
path: '/',
maxAge: 1000 * 60 * 10
},
store: store,
resave: false,
saveUninitialized: false
}));
app.use(function (req, res, next) {
res.setHeader('Access-Control-Allow-Origin', '*');
res.setHeader('Access-Control-Allow-Methods', 'GET, POST');
res.setHeader('Access-Control-Allow-Headers', 'X-Requested-With');
next();
});
app.get('/userLoggedIn', function(req, res) {
if(req.session) {
console.log('session cookie: \n' + JSON.stringify(req.session));
}
res.send({
loggedIn: req.session.username
});
})
app.post('/login', function(req, res) {
var username = req.body.data.username;
var password = req.body.data.password;
var User = mongoose.model('User', dbSchemas.userSchema);
User.findOne({username: username}, function(err, user) {
if (err) {
console.log(err);
} else {
bcrypt.compare(password, user.password, function(err, isMatching) {
if (err) {
console.log(err);
} else {
if (isMatching) {
res.send({
loggedIn: true,
session: req.session
});
} else {
res.send({
loggedIn: false,
});
return;
}
}
});
}
req.session.username = username;
console.log('created session cookie: \n' + JSON.stringify(req.session));
});
});`
Когда я делаю console.log
я получаю это обратно:
created session cookie:
{"cookie":{"originalMaxAge":600000,"expires":"2015-10-07T11:40:34.392Z","httpOnly":true,"path":"/"},"username":"LosGlennos"}
session cookie:
{"cookie":{"originalMaxAge":600000,"expires":"2015-10-07T11:40:38.262Z","httpOnly":true,"path":"/"}}
Как видите, get и post создали два разных сеансовых куки.
На самом деле я не знаю, где я все испортил, я столько раз читал код, что имена переменных начинают звучать смешно.
РЕДАКТИРОВАТЬ Я пытаюсь создать файл cookie сеанса и посмотреть, не истек ли сеанс для LosGlennos.
1 ответ
У меня сегодня была такая же проблема. Поскольку код Angular отсутствует в исходном сообщении, я точно не знаю, была ли у вас такая же проблема, но я опубликую свое решение на случай, если оно поможет.
Проблема, с которой я столкнулся, заключалась в том, что запросы POST не отправляют Cookies по умолчанию Таким образом, мой sessionID не отправлялся в запросе на вход. Увидеть:
https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS
Чтобы отправить Cookies, вы можете установить withCredentials в true в пост-операции
$http.post(
'/login',
{
username: theUsername,
password: thePassword
},
{
withCredentials: true
}
)
это опция, указанная в Angular Docs:
https://docs.angularjs.org/api/ng/service/$ http
В прошлом у меня также были проблемы с именами sessionId, когда имя по умолчанию connect.sid используется другим пакетом. Я заметил, что ваш код по умолчанию будет использовать connect.sid, поэтому может помочь использование уникального имени:
app.use(session({
...
name: 'myUniqueAppName'
}))