2012-05-11 24 views
22

Tôi nhận được lỗi sau khi sử dụng ApiKeyAuthentication tài nguyên Tastypie của tôi khi tôi cố gắng làm một yêu cầu HTTP sử dụng AJAX và Tastypie:'Yêu cầu tiêu đề lĩnh vực Authorization không được phép' lỗi - 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. 

Bất kỳ ý tưởng về cách giải quyết vấn đề này?

Sau đây là các tiêu đề yêu cầu từ 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 

Dưới đây là các tiêu đề phản hồi từ 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 

Như bạn có thể thấy, cả hai đều có tiêu đề cho phép, nhưng uỷ quyền không công việc.

Đây là middleware django mà tôi đang sử dụng để chỉnh sửa các tiêu đề phản ứng: https://gist.github.com/1164697

Edit: tôi đã tìm ra vấn đề. Tôi đã cố gắng kết nối với www.domain.com và chỉ chấp nhận domain.com

Trả lời

4

Điều này xảy ra do Same origin policy.

Bạn cần thực hiện cuộc gọi AJAX từ cùng miền khi có yêu cầu. Hoặc thực hiện thay đổi phía máy chủ, cho phép yêu cầu từ miền bên ngoài.

Để giải quyết điều này, bạn cần phải thực hiện những thay đổi trong tiêu đề tại http://domain.com bằng cách cho phép miền bên ngoài của bạn trong tiêu đề:

Access-Control-Allow-Origin: * 

đọc more

+0

Cuộc gọi AJAX đến từ cùng một tên miền. Làm cách nào để tôi thực hiện các thay đổi phía máy chủ để cho phép các yêu cầu từ các miền bên ngoài và các vấn đề bảo mật hiện tại bằng cách thực hiện việc này? – egidra

+0

Tôi đã cập nhật câu trả lời của mình – antyrat

+0

Tôi đã thêm tiêu đề sau vào tất cả các yêu cầu ajax của mình: 'Access-Control-Allow-Origin': '*'. Tôi vẫn nhận được cùng một lỗi: Yêu cầu trường tiêu đề Ủy quyền không được cho phép bởi Access-Control-Allow-Headers. – egidra

0

Vấn đề được rằng www.domain.com được xem là khác nhau hơn domain.com. domain.com đã hoạt động, nhưng khi tôi sử dụng www.domain.com, nó đã phát hiện ra tôi khi thực hiện yêu cầu từ một tên miền khác

+3

Bạn có lẽ nên đánh dấu câu trả lời của kẻ phản đối là chính xác. Nó chi tiết hơn, cung cấp liên kết, được viết trước đó, và ... bạn biết đấy ... đúng. – Martin

50

Câu trả lời của Antyrat chưa hoàn tất.

Bạn phải chỉ định tiêu đề mà máy chủ của bạn cho phép; trong trường hợp của bạn Ủy quyền.

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

Cảm ơn bạn rất nhiều. Tôi muốn nói thêm rằng tôi hơi "lười" và cố gắng sử dụng "Access-Control-Allow-Headers: *", và nó không hoạt động, nhưng với "Authorization" nó đã làm việc. –

+2

Tương tự tại đây, '*' không hoạt động nhưng Ủy quyền không – GoatInTheMachine

2

Mặc dù tôi upvoted câu trả lời của @Manuel Bitto,
Tôi muốn gửi một câu trả lời, trong đó có một bộ lọc CORS hoàn chỉnh mà làm việc cho tôi với 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); 
    } 
} 

Tôi sẽ đề nghị đặc biệt chú ý đến việc bổ sung OPTIONS vào các giá trị tiêu đề "Access-Control-Allow-Methods".
Lý do để làm điều đó là theo lời giải thích được cung cấp here bởi Mozilla,
nếu yêu cầu của bạn (giả sử POST) chứa tiêu đề đặc biệt hoặc loại nội dung (và đây là trường hợp của tôi), thì đối tượng XMLHttpRequest sẽ tạo một cuộc gọi OPTIONS bổ sung mà bạn cần phải giải quyết trong mã của mình.
Tôi hy vọng điều này sẽ hữu ích.

0

Tôi biết câu hỏi này cũ hơn.

Nhưng hôm nay tôi gặp phải vấn đề về cors sau khi thêm owin. Sau số lần tìm kiếm trên google và thử các giải pháp khác nhau. Tôi đã giải quyết vấn đề về cors bằng cách thêm bên dưới

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

Để biết thêm chi tiết, vui lòng thực hiện theo các liên kết bên dưới. Cảm ơn.

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

Các vấn đề liên quan