У меня есть фрейм на моей странице. Поскольку 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
указанием на эту страницу.
console.log('Now we have first-party storage access!');
прийти вthen
офrequestStorageAccess()
?Ответы:
TL; DR
Убедитесь, что для домена уже установлен файл cookie в контексте первой стороны.
В этом примере кода есть несколько моментов, на которые стоит обратить внимание. Обратите внимание, что на Safari 13.1 было протестировано следующее.
Условия запроса пользователя и последующего предоставления доступа:
document.requestStorageAccess
должен быть вызван в результате действия пользователя. Несмотря на то, что документально подтверждено в документах MDN ,document.hasStorageAccess
похоже , что они не распространяют действия пользователя.Условия возможности написать куки:
Файл cookie должен быть уже установлен в домене в контексте первой стороны. Этот файл cookie может быть установлен сервером в качестве заголовка ответа или JS с использованием document.cookie. После небольшого дальнейшего тестирования кажется, что этот cookie НЕ ДОЛЖЕН быть установлен с флагом домена, чтобы последующий cookie был установлен в контексте третьей стороны. Это означает, что в действительности существующий файл cookie также должен быть установлен в том же самом поддомене.
источник