Cookies in iframe können mit der Storage Access-API in Safari nicht gesetzt werden

9

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 iframeTag mit einem srcVerweis auf diese Seite.

lunr
quelle
1
Ich habe das gleiche Problem. Der Speicherzugriff scheint Zugriff auf vorhandene Cookies zu gewähren, speichert jedoch keine neuen. Dies gilt sowohl für die Verwendung von "document.cookie" als auch für neue Cookies, die im Header "Set-Cookie" zurückgegeben werden. Die Dokumentation scheint zu sagen, dass es funktionieren sollte, aber es funktioniert nicht.
Matt Cosentino
Mit Safari 13.1 wird die Anfrage abgelehnt, aber ich konnte nicht verstehen, warum.
7.
1
Ja, es ist wirklich frustrierend. BTW Safari 13.1 begann sich gleich zu verhalten, es scheint Zugriff zu gewähren, aber das Setzen von Cookies schlägt fehl.
8.
Wie in diesem Artikel angegeben, gibt es einige Regeln, um Zugriff zu gewähren. Und sollte nicht console.log('Now we have first-party storage access!');in der thenvon kommen requestStorageAccess()?
Supun Kavinda
@SupunKavinda Die ersten 3 Regeln gelten hier nicht. Ich verstehe Regel 5 nicht vollständig. Vielleicht bezieht es sich auf einen anderen Mechanismus, der die Domain auf die schwarze Liste gesetzt hat. Ich denke auch nicht, dass dies zutrifft, aber ich werde ein paar Dinge versuchen, um zu sehen, ob das damit zusammenhängt.
9.

Antworten:

3

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:

  1. document.requestStorageAccessmuss als Ergebnis einer Benutzeraktion aufgerufen werden. Trotz wie in den MDN-Dokumenten dokumentiert , document.hasStorageAccessscheint nicht zu der Benutzeraktion zu propagieren.
  2. Der Benutzer muss bereits in einem Erstanbieter-Kontext mit dem Dritten interagiert haben. Jeder Klick auf das Dokument reicht aus.

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.

Jackfrankland
quelle
Cookies funktionieren unter Berücksichtigung dieser Bedingungen. Es sieht jedoch so aus, als müssten Sie jedes Mal einen Zugriff anfordern, sodass wir dies vorerst für unbrauchbar halten. Vielleicht haben wir noch etwas falsch gemacht. In jedem Fall entscheiden wir uns, dies anders zu machen. Vielen Dank.
16.
@lunr kannst du das Ergebnis teilen?
Sergey Korzhov