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.
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 :(
quelle
Antworten:
Ich glaube, ich habe die Lösung gefunden: Apples Storage Access API: https://webkit.org/blog/8124/introducing-storage-access-api/
quelle
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.
quelle