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.