Использование Safari не позволяет устанавливать cookie-файлы в фреймах доменов, отличных от родительского домена, заголовки CORS на стороне сервера будут прокляты.
Чтобы уточнить: пользователь находится на domainA.com. Iframe для domainB.com открыт и пытается аутентифицировать пользователя на domainB.com внутри iframe. Заголовок Set-Cook ie возвращается с сервера внутри iframe domainB.com со всеми необходимыми заголовками, но Safari не отправляет его обратно при последующих вызовах.
Старый обходной путь был выполняя форму, отправьте из iframe и установите в ответе повара ie. Я предполагаю, что им понравилось то, что пользователь нажимал что-то, чтобы отправить форму. Вам нужно будет опросить повара ie, чтобы узнать, когда ответ вернулся, поскольку отправленные формы не имеют обратных вызовов, а в случае файлов cookie HttpOnly вы не можете, но, эй, это сработало! До тех пор, пока этого не произошло.
Затем более поздним способом было перенаправить пользователя в домен iframe в совершенно новом окне / вкладке, установить там случайного повара ie и с этого момента поддомен был «доверенным» внутри iframe. Опять же, для открытия нового окна / вкладки требовался щелчок, и даже была визуальная индикация открытия новой вкладки. Большая безопасность, такие стандарты.
А теперь, начиная с Safari 13 - больше нет обходного пути. Больше нет безопасного iframe cook ie setting ?
Любая другая схема аутентификации нам не подходит (например, заголовок Auth-X). Нам нужно использовать HttpOnly secure cook ie, так как мы не хотим, чтобы этот токен был каким-либо образом доступен для javascript на стороне клиента.
Чтобы было ясно, все отлично работает на любом другом браузер.
Соответствующий WebKit Bugzilla
У кого-нибудь есть предложения?
Редактировать:
Спасибо для ссылки @tomschmidt это кажется правильным направлением. Я пытался использовать API-интерфейс Apple Storage Access, но, к сожалению, хотя я и запрашиваю доступ, прежде чем инициализировать мои логины для входа в систему c с помощью 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();
Тем не менее, файлы cookie, полученные на / login Ответ API не отправляется при последующих вызовах API: (