Safari căn hộ không cho phép bạn đặt cookie trong iframe của các tên miền khác với miền mẹ, các tiêu đề CORS phía máy chủ bị nguyền rủa.
Để làm rõ: người dùng đang ở trên domainA.com. Một iframe cho domainB.com đang mở và cố gắng xác thực người dùng trên domainB.com bên trong iframe. Tiêu đề Set-Cookie được trả về từ máy chủ bên trong iframe domainB.com, với tất cả các tiêu đề bắt buộc, nhưng Safari không gửi lại trong các cuộc gọi tiếp theo.
Một cách giải quyết cũ là thực hiện một biểu mẫu gửi từ iframe và đặt cookie vào phản hồi. Tôi đoán họ thích thực tế là người dùng đã nhấp vào một cái gì đó để gửi biểu mẫu. Bạn sẽ phải thăm dò cookie để xem khi nào phản hồi trở lại, vì các lần gửi biểu mẫu không có cuộc gọi lại, và trong trường hợp cookie httpOnly bạn không thể, nhưng này, nó đã hoạt động! Cho đến khi nó không.
Sau đó, một cách giải quyết gần đây hơn là chuyển hướng người dùng đến miền iframe trong cửa sổ / tab hoàn toàn mới, đặt cookie ngẫu nhiên ở đó và từ thời điểm đó, tên miền phụ đó đã được "tin cậy" trong iframe. Một lần nữa, nó yêu cầu một lần nhấp để mở cửa sổ / tab mới và thậm chí còn có một dấu hiệu trực quan về việc mở tab mới. An ninh nhiều, tiêu chuẩn như vậy.
Và bây giờ, kể từ Safari 13 - Không còn cách giải quyết nữa. Không thiết lập Cookie iframe an toàn hơn 🤬
Bất kỳ lược đồ xác thực nào khác đều không tốt cho chúng tôi (ví dụ: tiêu đề Auth-X). Chúng tôi cần sử dụng cookie bảo mật httpOnly, vì chúng tôi không muốn mã thông báo đó có thể được truy cập bởi phía khách hàng javascript.
Để rõ ràng, mọi thứ hoạt động tuyệt vời trên bất kỳ trình duyệt khác.
Có ai có bất cứ đề nghị?
Biên tập:
Cảm ơn liên kết @tomschmidt, đó có vẻ là hướng đi đúng đắn. Tôi đã thử sử dụng API truy cập lưu trữ của Apple, nhưng thật không may, mặc dù tôi đảm bảo yêu cầu quyền truy cập trước khi khởi tạo logic đăng nhập của mình với 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();
Tuy nhiên, các cookie nhận được trên / phản hồi API đăng nhập sẽ không được gửi trong các cuộc gọi tiếp theo tới API :(