2016-01-10 19 views
5

Tôi có một thiết lập Django địa phương như sauDjango Localhost CORS không làm việc

Django Rest Framework: localhost:8000

AngularJS frontend: local apache running on http://localservername

Tôi đã cài đặt django-cors-headers và trong settings.py của tôi, tôi đã thiết lập của tôi

CORS_ORIGIN_WHITELIST = (
    'http://localhost', 
    'localservername', 
    'http://localservername', 
    '127.0.0.1' 
) 


MIDDLEWARE_CLASSES = (
'django.contrib.sessions.middleware.SessionMiddleware', 
'corsheaders.middleware.CorsMiddleware', 
'django.middleware.common.CommonMiddleware', 
'django.middleware.csrf.CsrfViewMiddleware', 
'django.contrib.auth.middleware.AuthenticationMiddleware', 
'django.contrib.auth.middleware.SessionAuthenticationMiddleware', 
'django.contrib.messages.middleware.MessageMiddleware', 
'django.middleware.clickjacking.XFrameOptionsMiddleware', 
) 

Tuy nhiên, tôi nhận đượcLỗi 210 bất cứ khi nào tôi nhấn bất kỳ API nào được phân phát từ số Rest Framework. Nếu tôi đặt CORS_ORIGIN_ALLOW_ALL = True thì API hoạt động chính xác nhưng điều đó không an toàn cho dữ liệu phía máy chủ của tôi.

Tôi phải thay đổi điều gì để sửa lỗi này?

+0

Bạn đã thêm 'corsheaders.middleware.CorsMiddleware' ngay trước' django.middleware.common.CommonMiddleware 'và' corsheaders' trong 'INSTALLED_APPS' của bạn? –

+0

@DaniilRyzhkov, Vâng tôi có, tôi sẽ thêm điều đó vào câu hỏi của tôi – Newtt

+0

@HamletHakobyan, Điều đó không quan trọng vì yêu cầu của tôi là từ 'localservername' thành' localhost: 8000' – Newtt

Trả lời

2

Theo yêu cầu http://www.w3.org/Security/wiki/Same_Origin_Policy, yêu cầu phải từ cùng một cổng, sơ đồ và máy chủ để được coi là cùng một nguồn gốc. Đây là một trong những máy chủ của bạn đang ở cổng 80 và một máy chủ khác nằm ở 8080.

Nguồn gốc được xác định bởi lược đồ, máy chủ và cổng URL. Nói chung nói, tài liệu được truy xuất từ ​​nguồn gốc riêng biệt được phân lập từ lẫn nhau. Ví dụ: nếu tài liệu được truy lục từ http://example.com/doc.html cố gắng truy cập DOM của tài liệu được truy xuất từ ​​https://example.com/target.html, tác nhân người dùng sẽ không cho phép truy cập vì nguồn gốc của tài liệu đầu tiên, (http, example.com, 80), không khớp với nguồn gốc của tài liệu thứ hai (https, example.com, 443).

0

Tôi đã gặp vấn đề tương tự. Bằng cách duyệt các django-cors-headers -code tìm thấy sai lầm của tôi là như sau:

Trong khi một hoàn CORS-header trông như thế này (schema thông báo VÀ hostname):

Access-Control-Allow-Origin: https://example.com 

Thiết lập CORS_ORIGIN_WHITELIST muốn nó trong một định dạng mà so sánh để urlparse.netloc (docs) của Origin -header, mà chỉ là dẫn chương trình (có thể là cổng)

def origin_found_in_white_lists(self, origin, url): 
    return (
     url.netloc in conf.CORS_ORIGIN_WHITELIST or 
     (origin == 'null' and origin in conf.CORS_ORIGIN_WHITELIST) or 
     self.regex_domain_match(origin) 
    ) 

trong khi regEx-whitelist so sánh nó so với đồng hoàn thành Origin -header.

Vì vậy, các thiết lập chính xác (như ví dụ trong thủ công thiết lập khẳng định một cách chính xác, nhưng không mô tả đúng) sẽ là:

CORS_ORIGIN_WHITELIST = (
    'example.com', 
) 

Mà có thể là một vấn đề nếu bạn không muốn API của bạn để nói chuyện với phiên bản http không an toàn của một trang web. Sử dụng RegEx trong trường hợp đó.

Cũng lưu ý: trong khi khắc phục sự cố, tôi phát hiện ra rằng tiêu đề CORS hoàn toàn vắng mặt nếu không tìm thấy kết quả phù hợp. Điều đó có nghĩa là sự vắng mặt của tiêu đề không phải là một dấu hiệu chắc chắn về sự cố hoàn toàn của phần mềm trung gian, nhưng có thể chỉ là một cấu hình sai.

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