Ich habe einen Iframe auf meiner Seite. Da Safari Cookies von Drittanbietern blockiert, versuche ich, die hier unter "Entwickleranleitung" vorgeschlagene Speicherzugriffs-API zu verwenden: https://webkit.org/blog/10218/full-third-party-cookie-blocking-and-more / . Ich habe den folgenden Code aus der Dokumentation kopiert :
<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>
Browserkonsolenausgabe:
[Log] hasAccess: true
[Log] Now we have first-party storage access!
[Log] document.cookie:
Wie Sie sehen, scheint der Zuschuss erfolgreich zu sein, kann aber den Cookie immer noch nicht setzen. Hat jemand eine Idee was falsch ist?
Safari Version 13.0.1
BEARBEITEN: Konsolenausgabe auf Safari 13.1:
[Log] hasAccess: false
[Log] error
Hinweis: Die beiliegende Seite ist ein einfaches iframe
Tag mit einem src
Verweis auf diese Seite.
console.log('Now we have first-party storage access!');
in derthen
von kommenrequestStorageAccess()
?Antworten:
TL; DR
Stellen Sie sicher, dass für die Domain in einem Erstanbieter-Kontext bereits ein Cookie gesetzt wurde.
Bei diesem Codebeispiel sind einige Dinge zu beachten. Bitte beachten Sie, dass Folgendes auf Safari 13.1 getestet wurde.
Bedingungen einer Benutzeraufforderung und anschließende Zugriffsgewährung:
document.requestStorageAccess
muss als Ergebnis einer Benutzeraktion aufgerufen werden. Trotz wie in den MDN-Dokumenten dokumentiert ,document.hasStorageAccess
scheint nicht zu der Benutzeraktion zu propagieren.Bedingungen, um einen Cookie schreiben zu können:
In einem Erstanbieter-Kontext muss bereits ein Cookie für die Domain gesetzt worden sein. Dieses Cookie kann entweder vom Server als Antwortheader oder von JS mithilfe von document.cookie festgelegt werden. Mit einigen weiteren Tests scheint es, dass dieses Cookie NICHT mit dem Domain-Flag gesetzt werden darf, damit ein nachfolgendes Cookie im Kontext eines Drittanbieters gesetzt wird. Dies bedeutet, dass das vorhandene Cookie tatsächlich auch auf dieselbe exakte Subdomain gesetzt werden muss.
quelle