2012-11-26 19 views
5

Vitals:XMLHttpRequest bị từ chối bởi Access-Control-Allow-Origin mặc dù nguồn gốc phù hợp một cách hoàn hảo

Version Chrome 23.0.1271.64 Mac OS X 10.8.2

Tình hình:

Tôi có một dịch vụ web được hiển thị tại https://api.myapi.com/ ... Tôi muốn cho phép các ứng dụng JavaScript tương tác với API này. CORS cảm thấy như phù hợp nhất rõ ràng (jsonp và bạn bè là khủng khiếp, hack khủng khiếp).

tôi có thể nhìn thấy trong Công cụ cho nhà phát triển yêu cầu preflight đang được gửi ra:

Request URL: https://api.myapi.com/someapi 
Request Method: OPTIONS 
Status Code: 200 OK 

Request Headers 

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, accept 
Access-Control-Request-Method: GET 
Connection: keep-alive 
Host: api.myapi.com 
Origin: http://prototypes.mycompany.com 
Referer: http://prototypes.mycompany.com/somepage.html 
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_2) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.64 Safari/537.11 

Response Headers 

Access-Control-Allow-Headers: Accept,Authorization,Content-Length,Content-Type,Cookie 
Access-Control-Allow-Methods: GET,POST,PUT,DELETE,HEAD,OPTIONS 
Access-Control-Allow-Origin: http://prototypes.mycompany.com 
Access-Control-Allow-Credentials: true 
Connection: close 

này sẽ rất tốt, đặc biệt là phản ứng Access-Control-Allow-Origin tiêu đề dường như để phù hợp với tiêu đề yêu cầu Origin một cách chính xác.

Ngay sau đó, yêu cầu thực tế đang cố gắng:

Request URL: https://api.myapi.com/someapi 

Request Headers 

Accept: application/json, text/javascript, */*; q=0.01 
Authorization: <custom authentication scheme, removed> 
Origin: http://prototypes.mycompany.com 
Referer: http://prototypes.mycompany.com/somepage.html 
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_2) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.64 Safari/537.11 

Nó sau đó xuất hiện như "Hủy" và các lỗi sau được phát ra:

XMLHttpRequest không thể tải https://api.myapi.com/someapi. Xuất xứ http://prototypes.mycompany.com không được cho phép bởi Access-Control-Allow-Origin.

Tôi bắt đầu với * là nguồn gốc được phép, nhưng không thành công với cùng một vấn đề.

Tôi đã sao chép sự cố này trên Mobile Safari cho iOS 5 và Firefox. Trong Firefox, hành vi thậm chí còn khó hiểu hơn: Máy chủ phản hồi 200 OK và sau đó 6-7KB dữ liệu (đó là những gì tôi mong đợi). Nhật ký phía máy khách nói rằng nó có 200 OK và ~ 300 byte dữ liệu (không có tiêu đề phản hồi, không có phản hồi nào cả ...) và sau đó kích hoạt trình xử lý "lỗi".

Tôi đang thiếu gì?

Trả lời

1

Vấn đề giải quyết! Tôi phải thoát ra khỏi gdb để tìm ra nó ...

Máy chủ proxy đã chèn các tiêu đề CORS của chính nó vào yêu cầu. Vì vậy, phiên HTTP có các tiêu đề được chỉ định nhiều lần. Kiểm tra bảo mật đang kiểm tra với tiêu đề đầu tiên, là "*" và không thực hiện được yêu cầu.Lỗi yêu cầu in ra giá trị tiêu đề cuối cùng, có vẻ chính xác.

Không hữu ích lắm, WebKit!

0

Ý tưởng:

  • tôi nhận thấy bạn không có Origin trong Access-Control-Allow-Headers của bạn. Tôi sẽ không nghĩ rằng họ cần thiết, nhưng bạn có Content-Length và tôi cũng không nghĩ điều đó là cần thiết.

  • Bạn đang sử dụng Authorization, bạn có nghĩ mình đang sử dụng credentials không? (Rõ ràng đôi khi bạn đang phải bao gồm Access-Control-Allow-Credentials: true trong các phản ứng.)

(Những chỉ xứng đáng là một "câu trả lời" nhưng các ý kiến ​​ngu ngốc không cho phép dòng mới.)

+0

Vì tôi đã đăng câu hỏi, tôi đã thêm 'Access-Control-Allow-Credentials', không có hiệu lực. Tôi sẽ thêm 'Origin' nhưng tôi không nghĩ rằng đây là vấn đề - sẽ không phải là thông báo lỗi sau đó báo cáo rằng một tiêu đề không hợp lệ đã được chỉ định? –

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