Impossibile impostare il cookie in iframe utilizzando l'API di accesso allo storage su Safari


9

Ho un iframe sulla mia pagina. Poiché Safari blocca i cookie di terze parti, sto cercando di utilizzare l'API di accesso allo storage come suggerito qui sotto "Guida per gli sviluppatori": https://webkit.org/blog/10218/full-third-party-cookie-blocking-and-more / . Ho copiato il seguente codice dalla documentazione :

<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>

Output della console del browser:

[Log] hasAccess: true
[Log] Now we have first-party storage access!
[Log] document.cookie: 

Come puoi vedere, la concessione sembra avere successo ma non è ancora possibile impostare il cookie. Qualcuno ha un'idea di cosa non va?

Safari Versione 13.0.1

EDIT: output della console su Safari 13.1:

[Log] hasAccess: false
[Log] error

Nota: la pagina allegata è un semplice iframetag con un srcpuntamento a questa pagina.


1
Ho lo stesso problema. L'accesso allo storage sembra dare accesso ai cookie esistenti ma non ne memorizzerà di nuovi. Questo vale per l'utilizzo di "document.cookie" e dei nuovi cookie restituiti nell'intestazione "Set-Cookie". La documentazione sembra dire che dovrebbe funzionare, ma non funziona.
Matt Cosentino,

Con Safari 13.1 la richiesta è stata respinta ma non riuscivo a capire il perché.
lun

1
Sì, è davvero frustrante. BTW Safari 13.1 ha iniziato a comportarsi allo stesso modo, sembra dare accesso ma l'impostazione dei cookie non riesce.
lun

Come specificato in questo articolo ci sono alcune regole per concedere l'accesso. E, non dovrebbe console.log('Now we have first-party storage access!');venire in thensu requestStorageAccess()?
Supun Kavinda,

@SupunKavinda Le prime 3 regole non si applicano qui. Non capisco completamente la Regola 5. Forse si riferisce ad altri meccanismi che hanno inserito nella lista nera il dominio. Non penso che questo valga neanche, ma proverò alcune cose per vedere se è correlato.
lun

Risposte:


3

TL; DR

Assicurati che sia già stato impostato un cookie per il dominio in un contesto di prima parte.


Ci sono un paio di cose da cercare con questo esempio di codice. Tieni presente che quanto segue è stato testato su Safari 13.1.

Condizioni per la richiesta di un utente e successiva concessione di accesso:

  1. document.requestStorageAccessdeve essere chiamato come risultato di un'azione dell'utente. Nonostante quanto documentato sui documenti MDN , document.hasStorageAccessnon sembra propagare l'azione dell'utente.
  2. L'utente deve aver già interagito con la terza parte in un contesto di prima parte. Qualsiasi clic sul documento farà.

Condizioni per poter scrivere un cookie:

Un cookie deve essere già stato impostato sul dominio in un contesto di prima parte. Questo cookie può essere impostato dal server come intestazione della risposta o da JS utilizzando document.cookie. Con un po 'di ulteriori test, sembra che questo cookie NON DEVE essere impostato con il flag di dominio per poter impostare un cookie successivo nel contesto di terze parti. Ciò significa che, in effetti, anche il cookie esistente deve essere impostato sullo stesso sottodominio esatto.


I cookie funzionano tenendo conto di queste condizioni. Ma sembra che tu debba richiedere l'accesso ogni volta, quindi lo troviamo inutilizzabile per ora. Forse stavamo ancora facendo qualcos'altro che non andava. In ogni caso, decidiamo di farlo diversamente. Grazie.
lun

@lunr puoi condividere il risultato?
Sergey Korzhov,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.