J'ai un iframe sur ma page. Comme Safari bloque les cookies tiers, j'essaie d'utiliser l'API d'accès au stockage comme suggéré ici sous `` Guide du développeur '': https://webkit.org/blog/10218/full-third-party-cookie-blocking-and-more / . J'ai copié le code suivant de la documentation :
<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>
Sortie de la console du navigateur:
[Log] hasAccess: true
[Log] Now we have first-party storage access!
[Log] document.cookie:
Comme vous pouvez le voir, la subvention semble réussir, mais ne peut toujours pas définir le cookie. Quelqu'un at-il une idée de ce qui ne va pas?
Safari version 13.0.1
EDIT: Sortie de la console sur Safari 13.1:
[Log] hasAccess: false
[Log] error
Remarque: La page englobante est une simple iframe
balise src
pointant vers cette page.
console.log('Now we have first-party storage access!');
venir dans lethen
derequestStorageAccess()
?Réponses:
TL; DR
Assurez-vous qu'un cookie a déjà été défini pour le domaine dans un contexte propriétaire.
Il y a quelques éléments à surveiller avec cet exemple de code. Veuillez noter que ce qui suit a été testé sur Safari 13.1.
Conditions d'une invite d'utilisateur et octroi d'accès suivant:
document.requestStorageAccess
doit être appelé à la suite d'une action de l'utilisateur. Malgré ce qui est documenté sur les documents MDN ,document.hasStorageAccess
ne semble pas propager l'action de l'utilisateur.Conditions pour pouvoir écrire un cookie:
Un cookie doit déjà avoir été défini sur le domaine dans un contexte propriétaire. Ce cookie peut être défini par le serveur comme en-tête de réponse, ou par JS à l'aide de document.cookie. Avec un peu de test supplémentaire, il semble que ce cookie NE DOIT PAS être défini avec l'indicateur de domaine pour qu'un cookie ultérieur soit défini dans le contexte tiers. Cela signifie qu'en fait, le cookie existant doit également être défini sur le même sous-domaine exact.
la source