Impossible de définir un cookie dans iframe à l'aide de l'API d'accès au stockage sur Safari

9

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 iframebalise srcpointant vers cette page.

lunr
la source
1
J'ai le même problème. L'accès au stockage semble donner accès aux cookies existants mais n'en stockera pas de nouveaux. Cela s'applique à l'utilisation de "document.cookie" ainsi qu'aux nouveaux cookies renvoyés dans l'en-tête "Set-Cookie". La documentation semble indiquer que cela devrait fonctionner, mais ce n'est pas le cas.
Matt Cosentino
Avec Safari 13.1, la demande est rejetée mais je ne comprenais pas pourquoi.
lunr
1
Oui, c'est vraiment frustrant. BTW Safari 13.1 a commencé à se comporter de la même manière, il semble donner accès mais la configuration des cookies échoue.
lunr
Comme cet article le précise, il existe certaines règles pour accorder l'accès. Et, ne devrait pas console.log('Now we have first-party storage access!');venir dans le thende requestStorageAccess()?
Supun Kavinda
@SupunKavinda Les 3 premières règles ne s'appliquent pas ici. Je ne comprends pas complètement la règle 5. Peut-être que cela fait référence à un autre mécanisme qui a mis le domaine sur liste noire. Je ne pense pas que cela s'applique non plus, mais je vais essayer quelques choses pour voir si cela est lié.
lunr

Réponses:

3

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:

  1. document.requestStorageAccessdoit être appelé à la suite d'une action de l'utilisateur. Malgré ce qui est documenté sur les documents MDN , document.hasStorageAccessne semble pas propager l'action de l'utilisateur.
  2. L'utilisateur doit déjà avoir déjà interagi avec le tiers dans un contexte de premier parti. Tout clic sur le document fera l'affaire.

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.

jackfrankland
la source
Les cookies fonctionnent en tenant compte de ces conditions. Mais il semble que vous devez demander l'accès à chaque fois, nous trouvons donc cela inutilisable pour l'instant. Peut-être que nous faisions encore quelque chose de mal. Dans tous les cas, nous décidons de procéder différemment. Merci.
lunr
@lunr pouvez-vous partager le résultat?
Sergey Korzhov