Резюме: мы делаем запрос на другое происхождение. Он отлично работает в Chrome и FF, но не в Safari.
CORS включен на сервере, и ответ на предполетный запрос выглядит хорошо.
Это часть ответа с сервера для предполетного запроса OPTIONS.
URI=/access-token/generate
HTTP Headers=[Access-Control-Allow-Credentials:true
Access-Control-Allow-Headers:origin, content-type, accept
Access-Control-Allow-Methods:GET, POST, PUT, DELETE, OPTIONS, HEAD
Access-Control-Allow-Origin:https://mybank.com
На стороне клиента мы установили withCredentials=true
.
Это код для выполнения запроса перекрестного происхождения. Обратите внимание, что пользователь должен войти в систему и приготовить сеанс ie до того, как будет сделан этот вызов.
var data = JSON.stringify({
"data": "mydata"
}
);
var xhr = new XMLHttpRequest();
xhr.withCredentials = true;
xhr.addEventListener("readystatechange", function () {
if (this.readyState === 4) {
console.log(this.responseText);
}
});
xhr.open("POST", "https://anotherbank.com/access-token/generate");
xhr.setRequestHeader("Content-Type", "application/json");
xhr.send(data);
- Предварительный вызов ОК во всех браузерах.
- В фактическом запросе , в то время как Firefox и Chrome отправляют кука сеанса ie, Safari этого не делает.
Проблема в Safari устранена после отключения Prevent Cross-Site Tracking
явным образом , но просить пользователей сделать это не идеально.
Я уже читал подобные вопросы раньше, совет, чтобы исправить это, должен иметь прокси между ними.
Есть ли другой способ решить эту проблему? Что делать с такими «законными» запросами, которые не используются для отслеживания?