Как держать сессии во всех браузерах?

230
19 декабря 2016, 19:36

Веб-приложение для ВК на Laravel, Nginx, PHP-FPM. Посетитель приходит с ключом в GET-параметрах, сервер проверяет валидность ключа, и если ключ валидный, записывает какие-то данные в сессию и отдаёт HTML главной страницы динамического приложения. Далее с клиента поступают Ajax-запросы, и перед выполнением каждого фильтр авторизации проверяет, есть ли в сессии определённые данные.

Сессии PHP держатся на куки. Но, как выяснилось, в редких случаях у людей не поддерживаются куки, и последующие Ajax-запросы приходят без куки.

Ладно, зато они приходят с указанием реферера – основной страницы, включая все GET-параметры. По ним тоже можно быстро проверить валидность запроса.

Теперь выяснилось, что ещё есть редкие индивиды, у которых и это не срабатывает! Свежий Chrome, возможно, какие-то настройки приватности, или режим Incognito, или расширение блокирует и куки, и реферера.

Как держать сессии в таком случае?

Костыль (?) планирую пока такой: в первом авторизованном GET-параметрами запросе отдавать в странице какой-то уникальный ключ сессии и добавлять его при каждом Ajax-запросе для подтверждения валидности запроса. Так должно работать, но сомневаюсь, что это «белое», «правильное» решение.

Как правильно держать сессию, когда клиент не хочет ни куки, ни реферера светить?

Answer 1

Для отправки с использованием jQuery, насколько я помню надо добавить параметр:

$.ajax( {
   /* Setup the call */
   xhrFields: {
     withCredentials: true
   }
 });

А лучше, если вы знакомы с REST API то там для аутентификации используются токены, посылаемые каждый раз в теле запроса. Это наиболее правильный подход.

И это не костыль, а подход используемый всеми при работе с AJAX и REST. По мне так сессии на основе куки это костыль для протокола HTTP, который изначально без сохранения состояния.

Только надо обязательно серьезно продумать аутентификацию по токенам и привязать как минимум к IP адресу.

READ ALSO
Хотелось бы получить критику на данный код

Хотелось бы получить критику на данный код

Это использование паттерна "Фабрика", прошу помощи понять, правильно ли я его использую

236
Передать другой формат даты в MySQL [дубликат]

Передать другой формат даты в MySQL [дубликат]

На данный вопрос уже ответили:

184
остановить отправку формы ajax

остановить отправку формы ajax

Как при соответствующем ответе от пхп файла остановить отправку формыСейчас форма отправляется в любом случае

181
Обратный отсчет jquery.flipCountDown

Обратный отсчет jquery.flipCountDown

У меня есть php переменная

287