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 :(
sumber
Jawaban:
Saya pikir saya mungkin telah menemukan solusinya: API Akses Penyimpanan Apple: https://webkit.org/blog/8124/introducing-storage-access-api/
sumber
Jadi, solusinya masih agak berfungsi, selama jendela baru menyimpan cookie yang ingin Anda simpan. Iframe masih tidak dapat menyimpan cookie itu sendiri. Dalam kasus saya, yang saya butuhkan adalah cookie id sesi. Jadi, saya membuka jendela sembulan kecil ketika pengguna memberikan akses penyimpanan. Ia mendapat dan menyimpan cookie id sesi, menutup, dan memuat ulang iframe. Iframe kemudian memiliki akses ke cookie id sesi dan mengirimkannya dalam permintaan berikutnya. Saya pikir ini hanya sementara, sepertinya mereka akan menghapus akses penyimpanan dari jendela sembulan di masa depan. Mungkin mereka akan memperbaiki iframe yang tidak dapat menyimpan cookie saat itu.
sumber