Запуск Safari не дозволяє вам встановлювати файли cookie в iframes доменів, відмінних від батьківського домену, а заголовки CORS на стороні сервера будуть прокляті.
Для уточнення: користувач перебуває на domainA.com. Iframe для domainB.com відкритий, і він намагається автентифікувати користувача на domainB.com всередині iframe. Заголовок Set-Cookie повертається з сервера всередині iframe domainB.com із усіма необхідними заголовками, але Safari не надсилає його назад у наступних дзвінках.
Старий спосіб вирішував форму надсилання з iframe та встановлював cookie у відповідь. Напевно, їм сподобався той факт, що користувач натискав щось, щоб подати форму. Вам доведеться опитувати файли cookie, щоб побачити, коли відповідь повернувся, оскільки в поданих формах немає зворотних дзвінків, а у випадку з файлами cookie HttpOnly ви не змогли, але так, воно спрацювало! Поки цього не сталося.
Потім, нещодавнє вирішення було перенаправлення користувача до домену iframe у абсолютно новому вікні / вкладці, встановлення там випадкового файлу cookie, і з цього моменту цей субдомен "довіряли" всередині iframe. Знову ж таки, для відкриття нового вікна / вкладки потрібен клацання, і навіть було візуальне вказівка на відкриття нової вкладки. Велика безпека, такі стандарти.
А тепер, що стосується Safari 13 - Більше не вирішується. Більш безпечне налаштування файлів cookie iframe 🤬
Будь-яка інша схема аутентифікації нам не підходить (наприклад, заголовок Auth-X). Нам потрібно використовувати захищений cookie HttpOnly, оскільки ми не хочемо, щоб цей маркер був доступним для клієнта на стороні JavaScript.
Щоб було зрозуміло, у будь-якому іншому браузері все чудово працює.
Відповідна веб-програма Bugzilla
Хтось має якісь пропозиції?
Редагувати:
Дякуємо за посилання @tomschmidt, що здається правильним напрямком. Я спробував використовувати API Storage Access від Apple, але, на жаль, хоча я обов'язково запитую доступ, перш ніж ініціалізувати свою логіку входу з API:
requestStorageAccess = async() => {
return new Promise(resolve => {
//@ts-ignore
document.requestStorageAccess().then(
function () {
console.log('Storage access was granted');
resolve(true);
},
function () {
console.log('Storage access was denied');
resolve(false);
}
);
});
}
const storageAccessGranted = await requestStorageAccess();
console.log(storageAccessGranted) // prints 'true'
await login();
Однак файли cookie, отримані у відповіді API / login, не надсилаються в наступні дзвінки в API :(