2012-05-11 3 views
22

Я получаю следующее сообщение об ошибке при использовании ApiKeyAuthentication для моих ресурсов Tastypie, когда я пытаюсь сделать запрос HTTP с использованием AJAX и Tastypie:«заголовок запроса поле авторизации не допускается» Ошибка - Tastypie

XMLHttpRequest cannot load http://domain.com/api/v1/item/?format=json&username=popo&api_key=b83d21e2f8bd4952a53d0ce12a2314c0ffa031b1. Request header field Authorization is not allowed by Access-Control-Allow-Headers. 

Любые идеи о том, как это решить?

Вот заголовки запроса от Chrome:

Request Headersview source 

Accept:*/* 
Accept-Charset: 
ISO-8859-1,utf-8;q=0.7,*;q=0.3 

Accept-Encoding:gzip,deflate,sdch 

Accept-Language:en-US,en;q=0.8 

Access-Control-Request-Headers: 
origin, authorization, access-control-allow-origin, accept, access-control-allow-headers 

Access-Control-Request-Method: 
GET 

Вот заголовки ответа от Chrome:

Response Headersview source 

Access-Control-Allow-Headers: 
Origin,Content-Type,Accept,Authorization 

Access-Control-Allow-Methods: 
POST,GET,OPTIONS,PUT,DELETE 

Access-Control-Allow-Origin:* 

Connection:keep-alive 

Content-Length:0 
Content-Type: 
text/html; charset=utf-8 

Date:Fri, 11 May 2012 21:38:35 GMT 

Server:nginx 

Как вы можете видеть, что они оба имеют заголовки для авторизации, но авторизация не Работа.

Вот Джанго промежуточного слоя, который я использую для редактирования заголовков ответа: https://gist.github.com/1164697

Edit: я понял проблему. Я пытался подключиться к www.domain.com, и он принимает только домен.com

ответ

4

Это происходит из-за Same origin policy.

Вам необходимо сделать звонок AJAX из того же домена, где и будет отправлен запрос. Или сделайте изменения на стороне сервера, разрешив запросы из внешних доменов.

Чтобы решить эту проблему вам нужно внести изменения в заголовки на http://domain.com, позволяя внешний домен в заголовках:

Access-Control-Allow-Origin: * 

Read more

+0

Аякса звонки поступают из того же домена. Как я могу сделать изменения на стороне сервера, чтобы разрешать запросы из внешних доменов, и каковы проблемы безопасности, возникающие при этом? – egidra

+0

Я обновил свой ответ – antyrat

+0

Я добавил следующий заголовок ко всем моим запросам ajax: «Access-Control-Allow-Origin»: '*'. Я все еще получаю ту же ошибку: поле заголовка запроса. Разрешения Access-Control-Allow-Headers разрешены. – egidra

0

Проблема, что www.domain.com рассматривалась как разные чем domain.com. domain.com работал, но когда я использовал www.domain.com, он обнаружил, что я делаю запросы из другого домена

+3

Возможно, вы должны отметить ответ antyrat как правильный. Он более подробно, содержит ссылки, был написан ранее, и ... вы знаете ... правильно. – Martin

50

Ответ Антырата не является полным.

Вы должны указать, какие заголовки разрешены вашим сервером; в вашем случае Авторизация.

Access-Control-Allow-Origin: * 
Access-Control-Allow-Methods: GET, POST, PUT, DELETE 
Access-Control-Allow-Headers: Authorization 
+2

спасибо. Я хотел бы добавить, что я был немного «ленив» и попытался использовать «Access-Control-Allow-Headers: *», и это не сработало, но с «Авторизацией» это действительно сработало. –

+2

То же самое здесь, '*' не работает, но авторизация – GoatInTheMachine

2

Хотя я upvoted ответ на @Manuel Bitto,
Я хотел бы опубликовать еще один ответ, который содержит полный фильтр Корс, который работает для меня с Apache Tomcat 5.x:

public class CorsFilter implements Filter { 

    public CorsFilter() { } 

    public void init(FilterConfig fConfig) throws ServletException { } 

    public void destroy() { } 

    public void doFilter(

      ServletRequest request, ServletResponse response, 
      FilterChain chain) throws IOException, ServletException { 
     HttpServletResponse httpServletResponse = (HttpServletResponse)response; 
     httpServletResponse.addHeader("Access-Control-Allow-Origin", "*"); 
     httpServletResponse.addHeader("Access-Control-Allow-Methods", "GET, POST, PUT, OPTIONS, DELETE"); 
     httpServletResponse.addHeader("Access-Control-Allow-Headers", "Authorization"); 

     chain.doFilter(request, response); 
    } 
} 

Я бы посоветовал специально обратить внимание на добавление OPTIONS к значениям заголовка «Access-Control-Allow-Methods».
Причина этого заключается в том, что согласно предоставленному объяснению Mozilla,
, если ваш запрос (скажем, POST) содержит специальный заголовок или тип содержимого (и это мой случай), то объект XMLHttpRequest будет генерировать дополнительный вызов OPTIONS, который необходимо указать в коде.
Надеюсь, это поможет.

0

Я знаю, что этот вопрос постарше.

Но сегодня я столкнулся с тем же вопросом, что и после добавления owin. После нескольких поисковых запросов в Google и различных решений. Я решил вопрос о выпуске, добавив ниже

<remove name="ExtensionlessUrlHandler-Integrated-4.0" /> 
<remove name="OPTIONSVerbHandler" /> 
<remove name="TRACEVerbHandler" /> 

Для получения более подробной информации, пожалуйста, следуйте приведенным ниже ссылкам. Благодарю.

[http://benfoster.io/blog/aspnet-webapi-cors]

Смежные вопросы