Краткая версия: мой токен JWT не сохраняется после обновления, если он указывает на домен за Cloudfront.
Не уверен, куда лучше это разместить — сюда или на stackoverflow, но поскольку я думаю, что проблема локализована в AWS Cloudfront, я решил начать здесь.
Моя установка:
- Настройки DNS Route 53 указывают на распределение Cloudfront
- 1 Поведение Cloudfront принимает трафик api/* и отправляет его на узел размещения экземпляра ELB EC2/приложение Express
- 1 Поведение Cloudfront берет трафик по умолчанию и отправляет его в контейнер s3, где находятся файлы одностраничных приложений Vue
- Приложение Node/express использует Passport.js для аутентификации с помощью стратегии JWT
- Эластичный бобовый стебель
На моем локальном компьютере все идеально. Когда я запускаю свой тестовый сайт и захожу на страницу своего профиля, все данные пользователя заполняют соответствующие поля. Когда я обновляю страницу, что-то происходит с токеном JWT, и все данные пользователя теряются. Это происходит и на других страницах за аутентификацией.
Вместо того чтобы направлять вызовы API на промежуточный этап (который находится за CloudFront), я попробовал направить API напрямую на экземпляр EC2, и все заработало отлично.
Итак, если проблема локализована в Cloudfront, что мне нужно сделать (нужно ли пересылать определенные заголовки), чтобы токен JWT каждый раз успешно передавался?
решение1
Если вы отправляете свой JWT в заголовке, то ваше предположение было верным, вам нужно сообщить CloudFront, чтобы он переслал заголовок источнику. Этого можно добиться, изменив Cache Based on Selected Request Headers
параметр в поведении кэша на одно из следующих значений:
- Все. Это перешлет все заголовки в источник;
- Белый список. Затем вы можете добавить свое имя заголовка, которое вы используете для отправки JWT (чаще всего это Authorization).
Обратите внимание, что эта опция имеет две функции:
- для пересылки определенных/всех заголовков в ваш источник
- для кэширования объектов на основе этих заголовков.
Убедитесь, что вы понимаете, как это может повлиять на поведение вашего кэша. Вы можете прочитать об этом больше наКэширование контента на основе заголовков запроса
Есть еще один параметр, который вы можете настроить в своем поведении кэша, который я почти всегда использую: Object Caching
. Вы можете настроить кэширование объектов таким Use Origin Cache Headers
образом, чтобы ваше приложение могло управлять кэшированием ответов. Эта настройка может быть доступна или нет в зависимости от вашего источника (S3/ALB/EC2) и/или вашего Cache Based on Selected Request Headers
значения.
Надеюсь, это поможет.