Я разрабатываю API, который позволяет пользователю аутентифицироваться (используя токены) и содержит перенаправления в том же домене. Теперь для неаутентифицированного запроса к конечной точке, который возвращает 303,
GET /documents/123 --> 303 redirect to `/documents/abc`
GET /documents/abc --> 200
все получается красиво.
Давайте сделаем аутентифицированный запрос к той же конечной точке, куда отправляется заголовок Authorization
. Это делает запрос предварительным запросом, и браузер выполняет предварительный OPTIONS
запрос, т. е.
OPTIONS /documents/123 --> 204 (everything okay, please proceed)
GET /documents/123 --> 303 redirect to `/documents/abc`
В этот момент вместо GET
обозначения фактического ресурса в /documents/abc
браузер выдает
XMLHttpRequest cannot load http://localhost:8000/people/username/nschloe.
The request was redirected to 'http://localhost:8000/people/YDHa-B2FhMie',
which is disallowed for cross-origin requests that require preflight.
Это поведение соответствует стандарту:
7.1.5 Запрос между источниками с предварительной проверкой
Если ответ имеет код состояния HTTP, который не находится в диапазоне 2xx
Примените шаги сетевой ошибки.
Похоже, это означает, что нельзя выполнять перенаправления для аутентифицированных ресурсов, даже если перенаправление находится в том же домене (localhost
).
Может ли это быть правдой? Есть ли общий обходной путь?
OPTIONS
у меня естьAccess-Control-Allow-Headers:Accept, Authorization, Content-Type, If-Match, If-Modified-Since, If-None-Match, If-Unmodified-Since, Accept-Encoding
. - person Nico Schlömer   schedule 22.01.2016GET /documents/123
, возвращается ошибка. - person Nico Schlömer   schedule 22.01.2016Same-Origin
) является вполне допустимым вариантом использования imho. - person Nico Schlömer   schedule 22.01.2016