Невозможно установить cookie в iframe, используя Storage Access 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

РЕДАКТИРОВАТЬ: Консольный вывод в Safari 13.1:

[Log] hasAccess: false
[Log] error

Примечание . Вложенная страница представляет собой простой iframeтег с srcуказанием на эту страницу.

lunr
источник
1
У меня такая же проблема. Доступ к хранилищу, по-видимому, дает доступ к существующим файлам cookie, но не сохраняет новые. Это относится как к использованию «document.cookie», так и к новым cookie-файлам, возвращаемым в заголовке «Set-Cookie». Документация говорит, что это должно работать, но это не так.
Мэтт Косентино
В Safari 13.1 запрос отклоняется, но я не могу понять, почему.
lunr
1
Да, это действительно расстраивает. КСТАТИ Safari 13.1 начал вести себя так же, похоже, дает доступ, но настройка куки не удается.
lunr
Как указано в этой статье, существуют некоторые правила для предоставления доступа. И не должен console.log('Now we have first-party storage access!');прийти в thenоф requestStorageAccess()?
Супун Кавинда
@SupunKavinda Первые 3 правила здесь не применяются. Я не совсем понимаю Правило 5. Может быть, это относится к какому-то другому механизму, который внес в черный список домен. Я не думаю, что это также применимо, но я попробую несколько вещей, чтобы увидеть, связано ли это.
lunr

Ответы:

3

TL; DR

Убедитесь, что для домена уже установлен файл cookie в контексте первой стороны.


В этом примере кода есть несколько моментов, на которые стоит обратить внимание. Обратите внимание, что на Safari 13.1 было протестировано следующее.

Условия запроса пользователя и последующего предоставления доступа:

  1. document.requestStorageAccessдолжен быть вызван в результате действия пользователя. Несмотря на то, что документально подтверждено в документах MDN , document.hasStorageAccessпохоже , что они не распространяют действия пользователя.
  2. Пользователь должен уже взаимодействовать с третьей стороной в контексте первой стороны. Любой щелчок по документу подойдет.

Условия возможности написать куки:

Файл cookie должен быть уже установлен в домене в контексте первой стороны. Этот файл cookie может быть установлен сервером в качестве заголовка ответа или JS с использованием document.cookie. После небольшого дальнейшего тестирования кажется, что этот cookie НЕ ДОЛЖЕН быть установлен с флагом домена, чтобы последующий cookie был установлен в контексте третьей стороны. Это означает, что в действительности существующий файл cookie также должен быть установлен в том же самом поддомене.

jackfrankland
источник
Файлы cookie работают с учетом этих условий. Но, похоже, вам нужно каждый раз запрашивать доступ, поэтому пока мы находим это непригодным. Может быть, мы все еще делаем что-то не так. В любом случае мы решили сделать это по-другому. Спасибо.
lunr
@lunr можешь поделиться результатом?
Сергей Коржов