Safari flat out ไม่อนุญาตให้คุณตั้งค่าคุกกี้ใน iframes ของโดเมนที่แตกต่างจากโดเมนหลักส่วนหัว CORS ฝั่งเซิร์ฟเวอร์จะถูกสาป
ในการชี้แจง: ผู้ใช้อยู่ใน domainA.com iframe สำหรับ domainB.com เปิดอยู่และพยายามตรวจสอบสิทธิ์ผู้ใช้ใน domainB.com ภายใน iframe ส่วนหัว Set-Cookie จะถูกส่งคืนจากเซิร์ฟเวอร์ภายใน domainB.com iframe พร้อมด้วยส่วนหัวที่จำเป็นทั้งหมด แต่ Safari ไม่ได้ส่งสายกลับในการโทรครั้งต่อไป
วิธีแก้ปัญหาแบบเก่ากำลังส่งฟอร์มจาก iframe และตั้งค่าคุกกี้ในการตอบกลับ ฉันเดาว่าพวกเขาชอบความจริงที่ว่าผู้ใช้คลิกที่สิ่งที่ต้องการส่งแบบฟอร์ม คุณจะต้องสำรวจความคิดเห็นของคุกกี้เพื่อดูว่าเมื่อใดที่การตอบกลับกลับมาเนื่องจากการส่งแบบฟอร์มไม่มีการเรียกกลับและในกรณีของคุกกี้ HttpOnly ที่คุณทำไม่ได้ แต่เดี๋ยวก่อนทำงานได้! จนกว่ามันจะไม่
จากนั้นวิธีแก้ปัญหาล่าสุดได้เปลี่ยนเส้นทางผู้ใช้ไปยังโดเมน iframe ในหน้าต่าง / แท็บใหม่การตั้งค่าคุกกี้แบบสุ่มที่นั่นและหลังจากนั้นเป็นต้นมาโดเมนย่อยนั้น "เชื่อถือได้" ภายใน iframe อีกครั้งต้องคลิกเพื่อเปิดหน้าต่าง / แท็บใหม่และยังมีข้อบ่งชี้ที่มองเห็นได้ของการเปิดแท็บใหม่ ความปลอดภัยมากมาตรฐานเช่นนี้
และในตอนนี้เช่นเดียวกับ Safari 13 - ไม่มีวิธีแก้ไขเพิ่มเติมอีก ไม่มีการตั้งค่าคุกกี้ iframe ที่ปลอดภัยยิ่งขึ้น 🤬
รูปแบบการตรวจสอบอื่น ๆ ไม่ดีสำหรับเรา (เช่นส่วนหัว Auth-X) เราจำเป็นต้องใช้คุกกี้ที่ปลอดภัยของ HttpOnly เนื่องจากเราไม่ต้องการให้โทเค็นนั้นสามารถเข้าถึงได้โดยไคลเอนต์ Javascript
เพื่อความชัดเจนทุกอย่างใช้งานได้ดีบนเบราว์เซอร์อื่น ๆ
ไม่มีใครมีข้อเสนอแนะใด ๆ ?
แก้ไข:
ขอบคุณสำหรับลิงค์ @tomschmidt ซึ่งดูเหมือนจะเป็นทิศทางที่ถูกต้อง ฉันพยายามใช้ API การเข้าถึงพื้นที่เก็บข้อมูลของ Apple แต่น่าเสียดายที่ถึงแม้ว่าฉันจะต้องแน่ใจว่าได้ร้องขอการเข้าถึงก่อนที่จะเริ่มต้นตรรกะการเข้าสู่ระบบของฉันด้วย 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();
อย่างไรก็ตามคุกกี้ที่ได้รับจากการตอบสนอง / login API จะไม่ได้รับการส่งต่อไปยังการเรียก API ต่อไปนี้ :(