У меня есть экспресс-приложение с использованием экспресс-сессии. Я использую Connect-Mongo в качестве магазина сессий. По большей части это работает нормально, но я столкнулся с проблемой, когда данные сеанса отсутствуют, когда сайт открывается по ссылке HTML на другом сайте.
Чтобы уточнить, есть ли у меня отдельная простая тестовая страница html с тегом привязки, указывающим на мое экспресс-приложение:
- Я нажимаю эту ссылку, сайт открывается, но данные сеанса не будут доступны. Не имеет значения, установил ли я цель ссылки "_blank" или нет. Если я обновлю браузер, данные сеанса будут доступны.
- Если вместо того, чтобы щелкнуть ссылку html, я щелкну правой кнопкой мыши и выберу
«Открыть ссылку в новой вкладке» откроет сайт и данные сессии будут доступны.
- Если я вставлю эту ссылку во что-то вроде Slack и нажму на нее, откроется сайт и будут доступны данные сеанса.
- Если я скопирую ссылку и вставлю ее в браузер, сайт загрузится и данные сеанса станут доступны.
Итак, я пытаюсь понять, что может привести к тому, что сеанс не будет работать, в зависимости от того, как открывается ссылка.
Я пробовал все варианты конфигурации сеанса, о которых могу думать, но ничего не решает проблему. Я даже попробовал два разных магазина сессий монго.
Я использую:
Экспресс 4.16.4
Экспресс сессия 1.15.6
Connect Mongo 2.0.3
Мангуст 5.4.22
Монго 4.0
Я также использую паспорт JS для аутентификации, но я попытался просто сохранить и извлечь случайные данные сеанса, и у меня возникла та же проблема.
Вот мой конфиг сессии:
import * as createMongoDBStore from 'connect-mongo';
import * as session from 'express-session';
const MongoStore = createMongoDBStore(session);
let sessionStore = new MongoStore({
mongooseConnection: mongoose.connection,
collection: 'Sessions'
});
app.use(session({
cookie: {
expires: true,
path: '/',
domain: process.env.DOMAIN_NAME || 'localhost',
httpOnly: true,
maxAge: parseInt(process.env.COOKIE_EXPIRES_IN) || 86400000,
sameSite: true,
secure: 'auto',
signed: true,
},
name: process.env.SESSION_NAME || 'MYAPP',
resave: false,
secret: process.env.APP_SESSION_TOKEN,
saveUninitialized: false,
store: sessionStore
}));