7TyLe
@7TyLe
Software Developer

Как установить куки при кроссдоменном AJAX запросе?

Имеется вопрос об установке междоменных/сторонних/3rd party или как ещё говорят межсайтовых cookie.
Имеется 2 домена (имена упрощены для большей ясности и лучшего понимания):

1. public.com (отсюда осуществляется отправка формы на 2ой домен AJAX-ом )
2. 3rdparty.com (принимает только AJAX запросы, написан на PHP)

К обоим доменам есть полный доступ, но они находятся на разных серверах/IP.
На 2ом домене в том числе есть возможность установить заголовки:
header('Access-Control-Allow-Credentials: true');
header('Access-Control-Allow-Origin: https://public.com');

Вопрос: какие в 2020 году есть хорошие варианты установки $_COOKIE для домена 3rdparty.com при посещении пользователем public.com?
  • Вопрос задан
  • 950 просмотров
Решения вопроса 1
@Kano
Почти точно так же как раньше, но есть небольшие дополнения.
Первое что нужно сделать это полностью перейти на https (если хотим что бы в хроме не хромало).
Сделать ajax запрос до 3rdparty.com что бы тот выставил куку, перед этим указав
req.withCredentials = true
Сервер на этот запрос должен дать ответ с нужными заголовками, например:
Access-Control-Allow-Credentials: true
Access-Control-Allow-Methods: GET, POST, PUT, DELETE, OPTIONS
Access-Control-Allow-Origin: https://public.com
Vary: Origin

И конечно установить саму куку
Set-Cookie: {CookieName}={CookieValue}; Max-Age=63072000; Path=/; SameSite=None; Domain=.3rdparty.com; HttpOnly; Secure

Особо хочу отметить заголовок "Access-Control-Allow-Origin" который всегда должен иметь конкретное значение, никаких подстановочных знаков.
А также обязательные атрибуты заголовка "Set-Cookie" - "SameSite=None" и "Secure"

Этот не будет работать на всех устройствах под ios и вроде бы в огненной лисе (там вообще запрещены кросдоменные куки если пользователь не посещал сайт который выставляет куку в основном окне браузера).
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
inoise
@inoise Куратор тега PHP
Solution Architect, AWS Certified, Serverless
Нет. Это невозможно. Если вы делаете единый логин то тут используются технологии Single Sign On
Ответ написан
@psiklop
У меня тоже к сожалению все старые способы перестали работать, они еще работают, но мало где.
Есть один муторный, но 100% рабочий способ:

1. Я открываю окно методом open на другой домен, делаю его максимально незаметным.
2. Читаю куку и передаю назад через postMessage метод.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы