Неможливо встановити файли cookie у iframe за допомогою API доступу до зберігання на Safari


9

У мене на своїй сторінці є кадр. Оскільки Safari блокує сторонні файли cookie, я намагаюся використовувати API доступу до зберігання, як тут запропоновано в розділі "Посібник для розробників": https://webkit.org/blog/10218/full-third-party-cookie-blocking-and-more / . Я скопіював наступний код з документації :

<script type="text/javascript">
  window.addEventListener('load', () => {
    document.getElementById('test-button').addEventListener('click', () => {
      document.hasStorageAccess().then(hasAccess => {
        console.log('hasAccess: ' + hasAccess);
        if (!hasAccess) {
          return document.requestStorageAccess();
        }
      }).then(_ => {
        console.log('Now we have first-party storage access!');
        document.cookie = "foo=bar";
        console.log(`document.cookie: ${document.cookie}`);
      }).catch(_ => {
        console.log('error');
      });
    });
  });
</script>

<button id="test-button">Test</button>

Вихід консолі браузера:

[Log] hasAccess: true
[Log] Now we have first-party storage access!
[Log] document.cookie: 

Як бачите, грант здається успішним, але все ще не може встановити файл cookie. Хтось має уявлення, що не так?

Версія Safari 13.0.1

EDIT: Виведення консолі на Safari 13.1:

[Log] hasAccess: false
[Log] error

Примітка. Сторінка, що додається, - це простий iframeтег із srcвказівкою на цю сторінку.


1
У мене те саме питання. Здається, що доступ до пам’яті надає доступ до існуючих файлів cookie, але не зберігатиме нових. Це стосується використання "document.cookie", а також нових файлів cookie, повернутих у заголовку "Set-Cookie". Документація, схоже, говорить, що вона повинна працювати, але це не так.
Метт Косентіно

У Safari 13.1 запит відхилено, але я не міг зрозуміти, чому.
Лунр

1
Так, це насправді засмучує. BTW Safari 13.1 почав поводитись так само, схоже, надає доступ, але налаштування файлів cookie не вдається.
Лунр

Оскільки ця стаття визначає, існують деякі правила надання доступу. І, чи не варто console.log('Now we have first-party storage access!');входити до thenскладу requestStorageAccess()?
Супун Кавінда

@SupunKavinda Перші 3 правила тут не застосовуються. Я не повністю розумію Правило 5. Можливо, це стосується якогось іншого механізму, який внесли в чорний список домен. Я не думаю, що це стосується і цього, але я спробую кілька речей, щоб побачити, чи це пов’язано.
обід

Відповіді:


3

TL; DR

Переконайтеся, що для домену вже встановлено файл cookie в сторонній контекст.


З цим зразком коду варто звернути увагу на кілька речей. Зверніть увагу, що на Safari 13.1 було випробувано наступне.

Умови запиту користувача та подальший дозвіл на доступ:

  1. document.requestStorageAccessповинно бути викликано в результаті дії користувача. Незважаючи на те, що документально підтверджено MDN , document.hasStorageAccessсхоже , це не поширює дії користувача.
  2. Користувач повинен вже взаємодіяти з третьою стороною в контексті першої сторони. Будь-який клік по документу зробить.

Умови можливості писати cookie:

Файл cookie повинен бути вже встановлений у домені в контексті першої сторони. Цей файл cookie може бути встановлений сервером як заголовок відповіді, або JS, використовуючи document.cookie. Трохи додаткового тестування, схоже, цей файл cookie НЕ МОЖЕ бути встановлений прапором домену для того, щоб наступний файл cookie був встановлений у сторонньому контексті. Це означає, що фактично існуючий файл cookie також повинен бути встановлений у тому ж точному піддомені.


Файли cookie працюють з урахуванням цих умов. Але схоже, що вам потрібно кожного разу запитувати доступ, тому ми зараз вважаємо це непридатним. Можливо, ми все ще робили щось не так. У будь-якому випадку ми вирішуємо це зробити інакше. Дякую.
обід

@lunr Ви можете поділитися результатом?
Сергій Коржов

@де у мене те саме питання. Чи є в IFrame спосіб встановити файли cookie чи ні.
MikBTC
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.