Веб-приложение для ВК на Laravel, Nginx, PHP-FPM. Посетитель приходит с ключом в GET-параметрах, сервер проверяет валидность ключа, и если ключ валидный, записывает какие-то данные в сессию и отдаёт HTML главной страницы динамического приложения. Далее с клиента поступают Ajax-запросы, и перед выполнением каждого фильтр авторизации проверяет, есть ли в сессии определённые данные.
Сессии PHP держатся на куки. Но, как выяснилось, в редких случаях у людей не поддерживаются куки, и последующие Ajax-запросы приходят без куки.
Ладно, зато они приходят с указанием реферера – основной страницы, включая все GET-параметры. По ним тоже можно быстро проверить валидность запроса.
Теперь выяснилось, что ещё есть редкие индивиды, у которых и это не срабатывает! Свежий Chrome, возможно, какие-то настройки приватности, или режим Incognito, или расширение блокирует и куки, и реферера.
Как держать сессии в таком случае?
Костыль (?) планирую пока такой: в первом авторизованном GET-параметрами запросе отдавать в странице какой-то уникальный ключ сессии и добавлять его при каждом Ajax-запросе для подтверждения валидности запроса. Так должно работать, но сомневаюсь, что это «белое», «правильное» решение.
Как правильно держать сессию, когда клиент не хочет ни куки, ни реферера светить?
Для отправки с использованием jQuery, насколько я помню надо добавить параметр:
$.ajax( {
/* Setup the call */
xhrFields: {
withCredentials: true
}
});
А лучше, если вы знакомы с REST API то там для аутентификации используются токены, посылаемые каждый раз в теле запроса. Это наиболее правильный подход.
И это не костыль, а подход используемый всеми при работе с AJAX и REST. По мне так сессии на основе куки это костыль для протокола HTTP, который изначально без сохранения состояния.
Только надо обязательно серьезно продумать аутентификацию по токенам и привязать как минимум к IP адресу.
Продвижение своими сайтами как стратегия роста и независимости