2016-01-10 16 views
5

मैं के रूप मेंDjango स्थानीय होस्ट CORS काम नहीं कर रहा

Django Rest Framework इस प्रकार एक स्थानीय Django सेटअप: localhost:8000

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

मैं django-cors-headers और स्थापित किया है मेरी settings.py में, मैंने सेटअप मेरी

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', 
) 

हालांकि, मुझेमिलता है 210 त्रुटि जब भी मैं Rest Framework से परोसा गया कोई भी एपीआई मारा। अगर मैं CORS_ORIGIN_ALLOW_ALL = True सेट करता हूं, तो एपीआई सही तरीके से काम करता है लेकिन यह मेरे सर्वर साइड डेटा के लिए बेहद असुरक्षित है।

इसे ठीक करने के लिए मुझे क्या बदलना है?

+0

क्या आपने 'corsheaders.middleware.CorsMiddleware' को पहले django.middleware.common से पहले जोड़ा है।आपके 'INSTALLED_APPS' में CommonMiddleware 'और' corsheaders' '? –

+0

@DaniilRyzhkov, हाँ मेरे पास है, मैं इसे अपने प्रश्न – Newtt

+0

@HamletHakobyan में जोड़ दूंगा, इससे कोई फर्क नहीं पड़ता क्योंकि मेरे अनुरोध 'localservername' से 'localhost: 8000' – Newtt

उत्तर

2

http://www.w3.org/Security/wiki/Same_Origin_Policy के अनुसार, अनुरोध उसी पोर्ट, योजना और मेजबान से समान मूल के रूप में माना जाना चाहिए। यहां आपके सर्वर में से एक पोर्ट 80 में है और दूसरा 8080 पर है।

मूल रूप से किसी URL की योजना, होस्ट और पोर्ट द्वारा परिभाषित किया गया है। आम तौर पर बोलते हुए, विशिष्ट उत्पत्ति से पुनर्प्राप्त दस्तावेज़ से अलग होते हैं। उदाहरण के लिए, यदि दस्तावेज़ http://example.com/doc.html की कोशिश करता से लिया गया एक दस्तावेज https://example.com/target.html से लिया गया की डोम तक पहुँचने के लिए, उपयोगकर्ता एजेंट पहुँच की अनुमति नहीं देंगे क्योंकि पहली दस्तावेज़ के मूल, (http, example.com, 80), करता है दूसरे दस्तावेज़ (https, example.com, 443) की उत्पत्ति से मेल नहीं खाते।

0

मुझे एक ही समस्या थी।

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

CORS_ORIGIN_WHITELIST सेटिंग एक प्रारूप है कि तुलना में यह चाहता है: एक पूरा CORS हेडर इस (नोटिस स्कीमा और होस्ट नाम) की तरह दिखता है जबकि

: ब्राउज़ कर django-cors-headers -code पाया करके अपनी गलती निम्नलिखित था urlparse.netloc (docs) Origin -header है, जो केवल मेजबान है (संभवतः बंदरगाह)

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) 
    ) 

RegEx-श्वेत सूची के खिलाफ यह तुलना करते हुए की को पूरा Origin -header।

तो सही सेटिंग (सेटअप-पुस्तिका को सही ढंग से कहा गया है, लेकिन ठीक से वर्णन करता है नहीं में उदाहरण के रूप में) होगा:

CORS_ORIGIN_WHITELIST = (
    'example.com', 
) 

कौन सा एक समस्या अगर आप अपने API से बात नहीं करना चाहते हो सकता है एक वेबसाइट के गैर-सुरक्षित http-version। उस मामले में RegEx का प्रयोग करें।

यह भी ध्यान दें: समस्या निवारण के दौरान मुझे पता चला कि कोई मिलान नहीं मिलने पर सीओआरएस-हेडर पूरी तरह से अनुपस्थित है। जिसका अर्थ यह है कि हेडर की अनुपस्थिति मिडलवेयर के पूर्ण खराब होने का एक निश्चित संकेत नहीं है, लेकिन हो सकता है कि सिर्फ एक गलत कॉन्फ़िगरेशन हो।

संबंधित मुद्दे