Несколько сессий, созданных для каждого запроса в express.js - PullRequest
0 голосов
/ 26 мая 2018

Проблема, которую я описываю здесь, происходит на моей локальной машине разработки, без какого-либо прокси между запросами браузера и приложениями.У меня есть несколько микросервисов Node.js., которые используют одни и те же технологии, используемые для управления сеансами:

Обычный поток видит, как пользователь выполняет вход в приложение аутентификации, а затем перенаправляется на внешний интерфейс (приложение React), который выполняет запросы CORS к бэкэндумикросервис, на котором работает сервер GraphQL.Эта проблема очень похожа на описанную здесь , даже если у меня немного другая конфигурация (статический маршрут только в приложении auth и используется до определения сеанса и false для resave и saveUninitialized options).

Оба приложения auth / backend имеют следующую конфигурацию:

const sessionOptions = {
    store: new RedisStore({
        client: redisClient,
        disableTTL: true,
    }),
    secret: "123",
    resave: false,
    saveUninitialized: false,
    proxy: false,
    rolling: true,
    cookie: {
        domain: config.cookie.domain,
        sameSite: config.cookie.sameSite,
        maxAge: toTime(config.cookie.maxAge).ms(),
        secure: config.cookie.secure,
    },
};
app.use(session(sessionOptions));

// Configure passport middleware
app.use(passport.initialize());
app.use(passport.session());

Бэкэнд-приложение имеет дополнительную конфигурацию CORS:

app.use(cors({
    origin: "frontend_url",
    credentials: true,
    methods: ['GET', 'POST'],
}));

Исходный статус Redis:

127.0.0.1:6379> KEYS "*"
(empty list or set)

Я захожу на страницу входа и создается сеанс:

127.0.0.1:6379> KEYS "*"
1) "sess:H5VTTBiNSQqu0Fsp2ZfSH2wBZtL4XEZh"

Я вхожу в систему, сеанс все еще один, пока я не буду перенаправлен в свое приложение React, а затемЯ получаю шесть новых сессий:

127.0.0.1:6379> KEYS "*"
1) "sess:NNWse-sp51fVRf6rlnsFpMlZO1gkPgYC"
2) "sess:ofQhH0iBbZOvsJBYMxwHjLL0DKxuFKfS"
3) "sess:XxsTGSoANPE5-fPYbwLmoCgvDho0NTnk"
4) "sess:9wFDQ3_RibJyEXEmJ_8gCxfnak4Uh0yP"
5) "sess:8khC8fgbtO53mJNilMhp88toIcsizxea"
6) "sess:jfQBWogefBr75IgZ5GykSgd5d3t3Mt_D"
7) "sess:H5VTTBiNSQqu0Fsp2ZfSH2wBZtL4XEZh"

По какой бы ссылке я ни щелкал, их число увеличивается до 16 и так далее.Я не могу обнаружить ни одного запроса к моему бэкэнду, который отправляет не куки-файл сеанса, а предварительные запросы OPTION.Поэтому я попытался использовать свою собственную конфигурацию вместо модуля CORS , но ничего не изменилось.Если я выйду из системы, очевидно, что только исходный сеанс, который соответствует моему cookie сеанса, будет удален из Redis, остальные (так как я отключил TTL, чтобы иметь «постоянные» сеансы) просто болтаются там.Также очевидно, что я не хочу, чтобы Redis заполнялся бесполезными сессиями, но я не могу найти то, что может быть реальной проблемой.Любой совет?Спасибо.

ОБНОВЛЕНИЕ : я заметил другое поведение, если я пытаюсь изменить функцию genid с помощью чего-то настроенного:

  • для службы аутентификации,Я возвращаю null, если у меня не определено req.body.username (${req.body.username}_${uuidv4()}).
  • для бэкэнда. Я просто возвращаю null каждый раз.

Первыйзапрос к службе аутентификации вызывает исключение invalid csrf, потому что, вероятно, его нельзя найти внутри Redis, поскольку genid теперь возвращает ноль.Второй запрос (при условии, что вы используете тот же адрес электронной почты, что и раньше, и что вход в систему выполнен успешно), приводит меня к веб-интерфейсу, и на этот раз я вижу, что создается только один сеанс.Очевидно, что это неправильный поток, но в любом случае странно, что он создает только один сеанс в Redis.

Ответы [ 3 ]

0 голосов
/ 28 мая 2018

В конце концов, я обнаружил несколько запросов, отправленных моей службе аутентификации, которые не установили cookie сессии, для некоторых путей, которые он даже не предполагал использовать.Итак, я определил эти пути, связанные с сеансом:

const sessionPaths = ['/path1', '/path2', ...];
app.use(sessionPaths, session(sessionOptions));
app.use(sessionPaths, passport.initialize());
app.use(sessionPaths, passport.session());
app.use(sessionPaths, csrf());
0 голосов
/ 06 марта 2019

Не уверен, что это полностью решено, но учитывая порядок его размещения, у вас может быть обработчик cors после обработчика сеанса.Поскольку предварительные запросы поступают в сеанс, возможно, создается для каждого из них, так как нет файла cookie сеанса или отправляемых учетных данных.Простое решение - переместить обработчик cors над обработчиком сеанса.

0 голосов
/ 27 мая 2018

Я столкнулся с той же проблемой несколько дней назад!Я настроил репо и поделился ссылкой на то же самое!Работает отлично!Проверьте это.

https://github.com/ritwbanerjee/angular-node-seed

...