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