Safari flat out tidak memungkinkan Anda mengatur cookie di iframe domain yang berbeda dari domain induk, header CORS di sisi server menjadi terkutuk.
Untuk memperjelas: pengguna ada di domainA.com. Iframe untuk domainB.com terbuka, dan upaya untuk mengotentikasi pengguna di domainB.com di dalam iframe. Set-Cookie header dikembalikan dari server di dalam domain iframe domainB.com, dengan semua header yang diperlukan, tetapi Safari tidak mengirimkannya kembali dalam panggilan berikutnya.
Pemecahan masalah lama adalah mengirimkan formulir dari iframe, dan mengatur cookie di respons. Saya kira mereka menyukai kenyataan bahwa pengguna mengklik sesuatu untuk mengirimkan formulir. Anda harus polling untuk cookie untuk melihat ketika respon kembali, karena pengiriman formulir tidak memiliki panggilan balik, dan dalam kasus cookie HttpOnly Anda tidak bisa, tapi hei, itu berhasil! Sampai tidak.
Kemudian, solusi yang lebih baru adalah mengarahkan pengguna ke domain iframe di jendela / tab baru, mengatur cookie acak di sana, dan sejak saat itu, subdomain itu "dipercaya" di dalam iframe. Sekali lagi, diperlukan klik untuk membuka jendela / tab baru, dan bahkan ada indikasi visual dari pembukaan tab baru. Banyak keamanan, standar seperti itu.
Dan sekarang, pada Safari 13 - Tidak ada lagi solusi. Tidak ada pengaturan cookie iframe yang lebih aman 🤬
Skema otentikasi lainnya tidak baik untuk kami (mis. Tajuk Auth-X). Kita perlu menggunakan cookie aman HttpOnly, karena kita tidak ingin token itu dengan cara apa pun diakses oleh sisi klien javascript.
Agar jelas, semuanya berfungsi dengan baik di browser lain.
Adakah yang punya saran?
Edit:
Terima kasih atas tautan @tomschmidt, sepertinya itu adalah arah yang benar. Saya mencoba menggunakan API Akses Penyimpanan Apple, tetapi sayangnya, meskipun saya memastikan untuk meminta akses sebelum menginisialisasi logika login saya dengan API:
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();
Namun, cookie yang diterima pada respons / login API tidak dikirim dalam panggilan berikutnya ke API :(