Я не могу получить Safari для успешного применения Set-Cookie
ответов сервера при использовании Fetch API (фактически, через fetch polyfill). Тот же код работает правильно в FF и Chrome (я тестировал с использованием как native, так и polyfill fetch
).Safari, не устанавливающий Cookies CORS, используя API-интерфейс JS Fetch
- Запрос осуществляется через домены;
- да, я устанавливаю
credentials: true
; - сервер отвечает на заголовок
Set-Cookie
; - последующие запросы отправляются из Chrome и FF с заголовками запросов файлов cookie, но Safari этого не делает;
- запрос использует HTTPS (сертификат самоподписанный и в домене разработки, но, по-видимому, он принят Safari на регулярных запросах); и
Кто-нибудь знает, в чем проблема?
Я прочитал документацию и прошел через многие из closed bug reports. Если я что-то пропустил, я думаю, может быть, проблема связана с 'default browser behaviour', касающейся файлов cookie и CORS, - а не с помощью fetch (чтение через исходный код polyfill, похоже, на 100% игнорируется куки). Несколько отчетов об ошибках свидетельствуют о том, что неправильный ответ сервера может предотвратить сохранение файлов cookie.
Мой код выглядит следующим образом:
function buildFetch(url, init={}) {
let headers = Object.assign({}, init.headers || {}, {'Content-Type': 'application/json'});
let params = Object.assign({}, init, { credentials: 'include', headers });
return fetch(`${baseUrl}${url}`, params);
}
buildFetch('/remote/connect', {method: 'PUT', body: JSON.stringify({ code })})
.then(response => response.json())
.then(/* complete authentication */)
запрос Фактическое разрешение ниже. Я использую cURL для получения точных данных запроса/ответа, так как Safari затрудняет его копирование и вставку.
curl 'https://mydevserver:8443/api/v1/remote/connect' \
-v \
-XPUT \
-H 'Content-Type: application/json' \
-H 'Referer: http://localhost:3002/' \
-H 'Origin: http://localhost:3002' \
-H 'User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/602.4.8 (KHTML, like Gecko) Version/10.0.3 Safari/602.4.8' \
--data-binary '{"token":"value"}'
* Trying 127.0.0.1...
* Connected to mydevserver (127.0.0.1) port 8443 (#0)
* TLS 1.2 connection using TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256
* Server certificate: mydevserver
> PUT /api/v1/remote/connect HTTP/1.1
> Host: mydevserver:8443
> Accept: */*
> Content-Type: application/json
> Referer: http://localhost:3002/
> Origin: http://localhost:3002
> User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/602.4.8 (KHTML, like Gecko) Version/10.0.3 Safari/602.4.8
> Content-Length: 15
>
* upload completely sent off: 15 out of 15 bytes
< HTTP/1.1 200 OK
< Access-Control-Allow-Origin: http://localhost:3002
< Access-Control-Allow-Credentials: true
< Access-Control-Allow-Headers: Origin, X-Requested-With, Content-Type, Accept, Api-Key, Device-Key
< Access-Control-Allow-Methods: GET, POST, PUT, DELETE, OPTIONS
< Access-Control-Expose-Headers: Date
< Content-Type: application/json; charset=utf-8
< Content-Length: 37
< Set-Cookie: express:sess=[SESSIONKEY]=; path=/; expires=Fri, 17 Feb 2017 15:30:01 GMT; secure; httponly
< Set-Cookie: express:sess.sig=[SIGNATURE]; path=/; expires=Fri, 17 Feb 2017 15:30:01 GMT; secure; httponly
< Date: Fri, 17 Feb 2017 14:30:01 GMT
< Connection: keep-alive
<
* Connection #0 to host mydevserver left intact
{"some":"normal","response":"payload"}