2013-05-05 24 views
10

Tôi đang viết một ứng dụng web cho một số dịch vụ sử dụng RESTful API. API có sẵn tại https://api.example và ứng dụng tại https://app.example. Các yêu cầu GET đơn giản sử dụng CORS chỉ hoạt động tốt trong Chrome và Firefox. Một số phương thức chấp nhận dữ liệu qua POST và trả lại mã 303 với uri mới trong tiêu đề Vị trí.Tại sao trình duyệt không thực hiện theo các chuyển hướng bằng XMLHTTPRequest và CORS?

OPTIONS preflight yêu cầu là tốt:

Request Method:OPTIONS 
Status Code:200 OK 

Request Headers

Accept:*/* 
Accept-Charset:UTF-8,*;q=0.5 
Accept-Encoding:gzip,deflate,sdch 
Accept-Language:en-US,en;q=0.8,ru;q=0.6 
Access-Control-Request-Headers:origin, authorization, content-type 
Access-Control-Request-Method:POST 
Connection:keep-alive 
DNT:1 
Host:api.example 
Origin:https://app.example 
Referer:https://app.example/app/ 
User-Agent:Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.32 (KHTML, like Gecko) Chrome/27.0.1425.0 Safari/537.32 SUSE/27.0.1425.0 

Tiêu đề phản hồi

Access-Control-Allow-Credentials:true 
Access-Control-Allow-Headers:Authorization, Content-Type 
Access-Control-Allow-Methods:GET,POST,PUT,DELETE,HEAD,OPTIONS 
Access-Control-Allow-Origin:https://app.example 
Access-Control-Expose-Headers:* 
Access-Control-Max-Age:3628800 
Connection:keep-alive 
Content-Length:0 
Date:Sun, 05 May 2013 15:22:50 GMT 
Server:nginx/1.2.5 

Sau đó, theo yêu cầu thực tế chỉ dừng lại sau khi nhận được 303:

Request URL:https://api.example 
Request Method:POST 
Status Code:HTTP/1.1 303 See Other 

đáp ứng tiêu đề:

Server:nginx/1.2.5 
Location:https://api.example/some_url 
Date:Sun, 05 May 2013 15:27:49 GMT 
Content-Type:application/json 
Content-Length:0 
Connection:keep-alive 
Access-Control-Max-Age:3628800 
Access-Control-Expose-Headers:* 
Access-Control-Allow-Origin:https://app.example 
Access-Control-Allow-Methods:GET,POST,PUT,DELETE,HEAD,OPTIONS 
Access-Control-Allow-Headers:Authorization, Content-Type 
Access-Control-Allow-Credentials:true 

By user agent RFC nên theo chuyển hướng, nhưng Chrome và FF dường như không hoạt động như mong đợi. Đó có phải là lỗi của trình duyệt hoặc tôi đang làm điều gì sai?

cập nhật: Nếu tôi bắt đầu chromium bằng --disable-web-security, mọi thứ hoạt động tốt.

+0

Yêu cầu của bạn là gì đối với yêu cầu 'thực' (không phải là chuyến bay trước CORS)? Tôi đang gặp một vấn đề rất giống nhau. Bạn đã giải quyết nó bằng bất kỳ cơ hội nào chưa? – vrutberg

+2

Dường như báo cáo lỗi này trong Chromium có thể có liên quan https://code.google.com/p/chromium/issues/detail?id=237490 – vrutberg

+0

@vrutberg có vẻ như chính xác như vậy. Hơn nữa nó * đôi khi * hoạt động. Ví dụ: một bài kiểm tra msdn http://samples.msdn.microsoft.com/ietestcenter/CORS/CORS_014.htm truyền cả trong Chrome và FF. Một người bạn của tôi đã lấy chính xác cùng một mã và đặt trên máy chủ của anh ấy và nó không hoạt động! http://twinspect.net/cors.htm – galadog

Trả lời

1

Nếu nó crom lỗi ở đây là lỗi có thể trên mã của bạn do crom suport:

  1. Nếu yêu cầu cùng nguồn gốc gây ra một chuyển hướng tới một nguồn gốc khác nhau,
    không thực thi kiểm soát truy cập kiểm tra phản hồi chuyển hướng
    chính nó, vì yêu cầu dẫn đến chuyển hướng là
    cùng một nguồn gốc.

  2. Nếu yêu cầu cùng nguồn gốc gây ra một chuyển hướng tới một nguồn gốc khác nhau,
    sử dụng URL yêu cầu ban đầu của là nguồn gốc cho yêu cầu mới không sử dụng một nguồn gốc bảo mật duy nhất.

  3. Theo dõi xem khách hàng (ví dụ: XMLHttpRequest) có thực sự yêu cầu
    thông tin đăng nhập đó được gửi ngay từ đầu không. Khi một yêu cầu cùng một xuất xứ chuyển hướng đến một nguồn gốc khác, yêu cầu ban đầu sẽ gửi cookie cho dù được yêu cầu hay không, vì nó là cùng một nguồn gốc. Yêu cầu nguồn gốc mới không được gửi cookie trừ khi chúng được yêu cầu, để kiểm soát truy cập kiểm tra trên phản hồi sẽ thành công nếu máy chủ cấp "Access-Control-Allow-Origin = *".

+0

Tôi tin rằng vấn đề của anh ta không liên quan đến một yêu cầu gốc. Đó là một yêu cầu có nguồn gốc chéo có phản hồi 302. –

13

Tôi cũng đã vật lộn với điều này. Có vẻ như các chuyển hướng 3xx cho các yêu cầu CORS được hiển thị trước bị cấm bởi thông số kỹ thuật.

http://www.w3.org/TR/cors/

Từ spec:

(Bước 1. và 2. chi tiết quá trình preflighting Và chúng ta đến bước ....)

... 3. Đây là yêu cầu thực tế thực tế. Áp dụng các bước yêu cầu và quan sát các quy tắc yêu cầu bên dưới khi đưa ra yêu cầu.

Nếu phản hồi có mã trạng thái HTTP 301, 302, 303, 307 hoặc 308 Áp dụng cache and network error steps.

Và sau đó nếu chúng ta di chuyển trên xuống http://www.w3.org/TR/cors/#cache-and-network-error-steps:

Bất cứ khi nào lỗi mạng bước được áp dụng, chấm dứt các thuật toán mà gọi này tập hợp các bước và thiết lập trạng thái yêu cầu cross-nguồn gốc lỗi mạng.

Lưu ý: Điều này không ảnh hưởng đến cài đặt thông tin đăng nhập của người dùng. I E. nếu block cờ cookie không được đặt, cookie sẽ được đặt theo phản hồi.

Bất cứ khi nào bộ nhớ cache và mạng lỗi bước được áp dụng, hãy làm theo những bước sau:

Hủy bỏ các mục trong bộ nhớ cache kết quả preflight nơi lĩnh vực nguồn gốc giá trị là một trận đấu case-sensitive cho nguồn gốc nguồn và url giá trị trường là kết quả khớp chữ thường cho URL yêu cầu.

Áp dụng các bước lỗi mạng hoạt động như thể thuật toán được gọi các bước bộ nhớ cache và mạng lỗi đã gọi ra các bước lỗi mạng thay thế.

(Nhấn mạnh lấy từ doc.)

3xx ← liên kết được, tuy nhiên, được phép CORS đơn giản yêu cầu.

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