Safari düz çıkışı, ana alan adından farklı alanların iframe'lerinde çerez ayarlamanıza izin vermez, sunucu tarafı CORS başlıkları lanetlenir.
Açıklığa kavuşturmak için: kullanıcı domainA.com'da. DomainB.com için bir iframe açıktır ve iframe içindeki domainB.com'da kullanıcının kimliğini doğrulamaya çalışır. Set-Cookie üstbilgisi, gerekli tüm üstbilgilerle domainB.com iframe içindeki sunucudan döndürülür, ancak Safari sonraki aramalarda geri göndermez.
Eski bir geçici çözüm, iframe'den bir form gönderme yapıyor ve yanıtta çerezi ayarlıyordu. Sanırım kullanıcı formu göndermek için bir şey tıklamıştı hoşuma gitti. Form gönderimlerinin geri çağrıları olmadığından ve HttpOnly çerezlerinde yapamadığınız için çerezin yanıtın ne zaman geri döndüğünü görmesi için anket yapmanız gerekir, ancak hey, işe yaradı! Kadar yoktu.
Ardından, daha yeni bir geçici çözüm kullanıcıyı yepyeni bir pencere / sekmedeki iframe alanına yönlendiriyordu, orada rastgele bir çerez ayarlıyordu ve o andan itibaren bu alt alan iframe içinde "güvenilir" idi. Yine, yeni pencereyi / sekmeyi açmak için bir tıklama gerekiyordu ve yeni sekme açıklığının görsel bir göstergesi bile vardı. Çok güvenlik, bu standartlar.
Ve şimdi, Safari 13'ten itibaren - Artık geçici çözüm yok. Artık güvenli iframe çerez ayarı yok 🤬
Başka herhangi bir kimlik doğrulama düzeni bizim için iyi değildir (örn. Auth-X başlığı). Bu token'ın herhangi bir şekilde javascript istemci tarafı tarafından erişilebilir olmasını istemediğimizden, HttpOnly güvenli bir çerez kullanmamız gerekir.
Açık olmak gerekirse, diğer tarayıcılarda her şey harika çalışıyor.
Kimsenin önerisi var mı?
Düzenle:
@Tomschmidt bağlantısı için teşekkürler, bu doğru yön gibi görünüyor. Apple'ın Depolama Erişimi API'sını kullanmayı denedim, ancak maalesef, giriş mantığımı API ile başlatmadan önce erişim isteğinde bulunduğumdan emin olmama rağmen:
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();
Yine de, / login API yanıtında alınan çerezler, daha sonraki API çağrılarında gönderilmiyor :(