Поле заголовка запроса Ajax. Ключ недопустим с помощью Access-Control-Allow-Headers
Попытка создать базовую платформу служб DNN WebAPI, но у меня возникли проблемы с ее использованием с помощью CORS. У меня есть все соответствующие заголовки (я думаю), но он все еще не работает.
Ошибка:
XMLHttpRequest cannot load http://www.dnndev.me/mysite/builder/API/echo?message=Hello+World&_=1412707749275. Request header field Key is not allowed by Access-Control-Allow-Headers.
Заголовок запроса:
Remote Address: 127.0.0.1:80
URL: http://www.dnndev.me/mysite/builder/API/echo?message=Hello
Request Method: OPTIONS
Status Code: 200 OK
Accept: */*
Accept-Encoding: gzip,deflate,sdch
Accept-Language: en-US,en;q=0.8
Access-Control-Request-Headers: accept, key
Access-Control-Request-Method: GET
Connection: keep-alive
Host: www.dnndev.me
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2062.124 Safari/537.36
Заголовки ответов:
Access-Control-All-Headers: Origin, X-Requested-With, Content-Type, Accept, Key
Access-Control-Allow-Methods: *
Access-Control-Allow-Origin: *
Cache-Control: no-cache
Content-Length: 13
Content-Type: application/json; charset=utf-8
Date: Tue, 07 Oct 2014 18:49:10 GMT
Expires: -1
Pragma: no-cache
Server: Microsoft-IIS/7.5
Как правило, эта ошибка будет вызвана отсутствием соответствующего заголовка в "Access-Control-All-Headers". Однако я отправляю правильный ответ, чтобы позволить ajax продолжить его запрос. Он просто отказывается.
Вот мой вызов ajax методу:
$.ajax({
type: 'GET',
url: 'http://www.dnndev.me/mysite/builder/API/echo',
dataType: 'json',
data: { message: 'Hello' },
crossDomain: true,
headers: { 'Key': 'Bearer 7680ff6e-1362-4236-a9cd-c6bc8b6f13ea' },
success: function (result) { console.log(result); }
});
Вероятно, очевидно, но это происходит только при перекрестных запросах домена и только тогда, когда я включаю пользовательский заголовок (поэтому, заставляя ajax делать ОПЦИИ).
Ответы
Ответ 1
В запросе предполетного сервера сервер отвечает следующим пользовательским заголовком:
Access-Control-All-Headers: Origin, X-Requested-With, Content-Type, Accept, Key
тогда как если вы (или человек, который написал этот сервер) внимательно прочитали о CORS, он должен был ответить:
Access-Control-Allow-Headers: Origin, X-Requested-With, Content-Type, Accept, Key
Теперь клиентский клиент может продолжить использование пользовательского заголовка Key
.
При этом Bearer
достаточно специфичен для OAuth 2, который отправляется по всему заголовку Authorization
. Использование Key
похоже на ужасное нарушение RFC и прочее, а также переосмысление колеса.
Ответ 2
Обратите внимание на опечатку в вопросе Nyx и ответ Дарина ( "ow" отсутствует). Итак,
Access-Control-Allow-Headers: Origin, X-Requested-With, Content-Type, Accept, Key
и он разрешает сообщение об ошибке "Поле заголовка заголовка запроса" Поле заголовка запроса "недопустимо с помощью заголовков Access-Control-Allow-Head-заголовков в предполетном режиме", если оно отправлено в ответ на запрос браузера OPTION.
Ответ 3
Добавьте это в заголовки ответов сервера:
header ('Access-Control-Allow-Headers: Origin, Content-Type, X-Auth-Token, Authorization');