Mam iframe na mojej stronie. Ponieważ Safari blokuje pliki cookie innych firm, staram się korzystać z interfejsu API Storage Storage, jak sugerowano tutaj w „Wskazówkach dla programistów”: https://webkit.org/blog/10218/full-third-party-cookie-blocking-and-more / . Skopiowałem następujący kod z dokumentacji :
<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>
Dane wyjściowe konsoli przeglądarki:
[Log] hasAccess: true
[Log] Now we have first-party storage access!
[Log] document.cookie:
Jak widać, grant wydaje się udany, ale nadal nie można ustawić pliku cookie. Czy ktoś ma pojęcie, co jest nie tak?
Wersja Safari 13.0.1
EDYCJA: Dane wyjściowe konsoli w Safari 13.1:
[Log] hasAccess: false
[Log] error
Uwaga: załączająca strona jest prostym iframe
tagiem ze src
wskazaniem na tę stronę.
console.log('Now we have first-party storage access!');
przyjść wthen
odrequestStorageAccess()
?Odpowiedzi:
TL; DR
Upewnij się, że w domenie został już ustawiony plik cookie.
Jest kilka rzeczy, na które należy zwrócić uwagę w tym przykładzie kodu. Uwaga: poniższe testy zostały przetestowane w przeglądarce Safari 13.1.
Warunki monitu użytkownika, a następnie przyznania dostępu:
document.requestStorageAccess
musi zostać wywołany w wyniku działania użytkownika. Pomimo tego, jak udokumentowano w dokumentach MDN ,document.hasStorageAccess
nie wydaje się propagować działania użytkownika.Warunki możliwości zapisania pliku cookie:
Plik cookie musi być już ustawiony w domenie w kontekście pierwszej strony. Ten plik cookie może zostać ustawiony przez serwer jako nagłówek odpowiedzi lub przez JS za pomocą document.cookie. Po nieco dalszych testach wydaje się, że NIE MOŻNA ustawić tego pliku cookie z flagą domeny, aby kolejny plik cookie mógł zostać ustawiony w kontekście strony trzeciej. Oznacza to, że w rzeczywistości istniejący plik cookie musi być również ustawiony na tę samą dokładną subdomenę.
źródło