Safari 13+ iframe blockiert CORS-Cookies


9

Mit Safari Flat Out können Sie keine Cookies in Iframes von Domänen setzen, die sich von der übergeordneten Domäne unterscheiden. Serverseitige CORS-Header sind verdammt.

Zur Verdeutlichung: Benutzer ist auf domainA.com. Ein Iframe für domainB.com ist geöffnet und versucht, den Benutzer auf domainB.com innerhalb des Iframes zu authentifizieren. Der Set-Cookie-Header wird vom Server im iframe domainB.com mit allen erforderlichen Headern zurückgegeben, aber Safari sendet ihn bei nachfolgenden Aufrufen nicht zurück.

Eine alte Problemumgehung bestand darin, ein Formular aus dem Iframe zu senden und das Cookie in der Antwort zu setzen. Ich denke, sie mochten die Tatsache, dass der Benutzer auf etwas geklickt hat, um das Formular zu senden. Sie müssten nach dem Cookie fragen, um zu sehen, wann die Antwort zurückkommt, da Formularübermittlungen keine Rückrufe haben, und im Fall von HttpOnly-Cookies konnten Sie nicht, aber hey, es hat funktioniert! Bis es nicht geschah.

Eine neuere Problemumgehung bestand darin, den Benutzer in einem brandneuen Fenster / Tab in die Iframe-Domäne umzuleiten und dort ein zufälliges Cookie zu setzen. Von diesem Moment an war diese Subdomäne im Iframe "vertrauenswürdig". Auch hier war ein Klick erforderlich, um das neue Fenster / die neue Registerkarte zu öffnen, und es gab sogar eine visuelle Anzeige der neuen Registerkarteöffnung. Viel Sicherheit, solche Standards.

Und jetzt ab Safari 13 - Keine Problemumgehung mehr. Keine sichere Iframe- Cookie-Einstellung mehr 🤬

Jedes andere Authentifizierungsschema ist nicht gut für uns (z. B. Auth-X-Header). Wir müssen ein sicheres HttpOnly-Cookie verwenden, da wir nicht möchten, dass dieses Token in irgendeiner Weise für Javascript clientseitig zugänglich ist.

Um klar zu sein, funktioniert alles gut mit jedem anderen Browser.

Relevantes WebKit Bugzilla

Hat jemand irgendwelche Vorschläge?

Bearbeiten:

Danke für den Link @tomschmidt, das scheint die richtige Richtung zu sein. Ich habe versucht, die Storage Access-API von Apple zu verwenden, aber leider muss ich den Zugriff anfordern, bevor ich meine Anmeldelogik mit der API initialisiere:

requestStorageAccess = async() => {
    return new Promise(resolve => {
      //@ts-ignore
      document.requestStorageAccess().then(
        function () {
          console.log('Storage access was granted');
          resolve(true);
        },
        function () {
          console.log('Storage access was denied');
          resolve(false);
        }
      );    
    });
  }


const storageAccessGranted = await requestStorageAccess();
console.log(storageAccessGranted) // prints 'true'
await login();

Die in der API-Antwort / login empfangenen Cookies werden jedoch bei nachfolgenden Aufrufen der API nicht gesendet :(


Stellen Sie sicher, dass dies nur bei expliziter Interaktion mit dem Iframe wie onclick ausgelöst wird.
Tomschmidt

1
Ja, so habe ich es gemacht. Schauen Sie sich das Webkit-Bugzilla-Problem an, mit dem ich verlinkt habe. Ich denke, dies ist ein tatsächlicher Fehler am Ende von Safari: /
Tom Teman

Das Problem ist nicht, dass die Cookies nicht gesendet werden. Wenn Sie Speicherzugriff anfordern, werden vorhandene Cookies an den Server gesendet. Das Problem ist, dass neue Cookies überhaupt nicht gespeichert werden und daher nicht zum Senden da sind.
Matt Cosentino

@MattCosentino Ja, das habe ich gemeint - "Cookies, die in der / login-API-Antwort empfangen wurden" sind neue Cookies, die in der Set-Cookie-Header-Antwort an die iframe-Domäne zurückgesendet werden, aber der nächste Aufruf von der iframe-Domäne enthält diese nicht Cookies in der Anfrage. Ja, es ist richtiger zu sagen, dass die Ursache des Problems darin besteht, dass in diesem Szenario keine neuen Cookies im Browser gespeichert werden.
Tom Teman

Antworten:



0

Die Problemumgehung funktioniert also immer noch, solange im neuen Fenster das Cookie gespeichert wird, das Sie speichern möchten. Der Iframe kann immer noch keine eigenen Cookies speichern. In meinem Fall brauchte ich nur den Sitzungs-ID-Cookie. Daher öffne ich ein kleines Popup-Fenster, wenn der Benutzer Speicherzugriff gewährt. Der Sitzungs-ID-Cookie wird abgerufen und gespeichert, der Iframe wird geschlossen und neu geladen. Der Iframe hat dann Zugriff auf das Sitzungs-ID-Cookie und sendet es in nachfolgenden Anforderungen. Ich denke, dies ist nur vorübergehend, es sieht so aus, als würden sie irgendwann in Zukunft den Speicherzugriff aus Popup-Fenstern entfernen. Vielleicht beheben sie den Iframe, der bis dahin keine Cookies speichern kann.


Matt, ich habe eine ähnliche Lösung mit einem Popup verwendet, das auf dem Desktop Safari 13.1 funktioniert, aber beim Testen auf einem iPad Safari 13.4 funktioniert es nicht. Konnten Sie dies auf einem iPad zum Laufen bringen? Danke
teamdane
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.