Iframe Safari 13+ блокує файли cookie CORS


9

Запуск 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 :(


Переконайтеся, що це спрацьовує лише при явній взаємодії з iframe, як-от onclick.
— tomschmidt

1
Так, саме так я і зробив. Ознайомтеся з проблемою, пов’язаною з баггіллою веб-сайту, до якої я пов’язаний, я думаю, що це фактична помилка в кінці Safari: /
— Том Теман

Проблема не в тому, що файли cookie не надсилаються. Якщо ви вимагаєте доступу до пам’яті, існуючі файли cookie надсилаються на сервер. Проблема полягає в тому, що будь-які нові файли cookie взагалі не зберігаються, тому вони там не надсилаються.
— Метт Косентіно

@MattCosentino Так, саме це я мав на увазі - "кукі, отримані на відповіді API / login", - це нові файли cookie, які надсилаються назад у відповіді заголовка Set-Cookie на домен iframe, але наступний виклик з домену iframe не включає ці куки в запиті. Так що так, правильніше сказати, що корінь проблеми полягає в тому, що в цьому веб-переглядачі не зберігаються нові файли cookie в цьому сценарії.
— Том Теман

Відповіді:


1

Я думаю, що я, можливо, знайшов рішення: API доступу до зберігання Apple: https://webkit.org/blog/8124/introducing-storage-access-api/


Ей, дякую за ідею, але я боюся, що це не зробило трюк (перевірити мою відповідь редагувати)
— Том Теман

1
У мене теж виникає проблема із сафарі 13. Будь-яке рішення?
— Нірошана

0

Отже, вирішення проблеми все ще працює, доки в новому вікні зберігається файл cookie, який ви хочете зберегти. Iframe все ще не може зберігати власні файли cookie. У моєму випадку все, що мені було потрібно, - це файли cookie сеансу. Отже, я відкриваю невелике спливаюче вікно, коли користувач надає доступ до пам’яті. Він отримує та зберігає файли cookie сеансу id, закриває та перезавантажує iframe. Потім iframe має доступ до файлу cookie сеансу і надсилає його в наступних запитах. Я думаю, що це лише тимчасово, але схоже, що вони колись у майбутньому видалять доступ до пам’яті зі спливаючих вікон. Можливо, вони виправлять, якщо до цього часу кадр не зможе зберігати файли cookie.


Метт, я використав подібне рішення із спливаючим вікном, яке працює на робочому столі Safari 13.1, але тестування на iPad Safari 13.4 не працює. Чи вдалося вам зробити це на iPad? Thnx
— teamdane
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.