Поле заголовка запроса 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');