Проблема, которую я описываю здесь, происходит на моей локальной машине разработки, без какого-либо прокси между запросами браузера и приложениями.У меня есть несколько микросервисов 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.