2011-11-10 17 views
6

इंटरनेट खोजने के बाद, आम तौर पर लोग इस स्थिति से निपटते हैं --- सामने वाला अंत django व्यू फ़ंक्शन द्वारा उत्पन्न होता है जो उपयोगकर्ता को सीएसआरएफ टोकन की कुकी भेज सकता है। जब उपयोगकर्ता को AJAX का उपयोग कर सर्वर का अनुरोध होता है, तो लोग AJAXSend व्यवहार को फिर से लिख सकते हैं जो सर्वर पर csrf भेजता है।बैकएंड और फ्रंटएंड अलग होने पर Django CSRF

हालांकि, मेरी स्थिति यह है कि मेरा फ्रंट एंड पूरी तरह से बैक-एंड से अलग हो गया है, यानी, मेरा फ्रंट एंड एक समर्पित सर्वर में है जो nginx चला रहा है, और मेरे पास केवल एक HTML हैशबैंग का उपयोग करके सभी अलग-अलग पृष्ठों को प्रदान करता है । मेरा बैक-एंड अलग-अलग डोमेन नाम का उपयोग कर विभिन्न सर्वर में चल रहा है, और इस मामले में, ग्राहक सीएसआरएफ कुकी कैसे प्राप्त करता है? मेरा बैक-एंड केवल जेसन एपीआई रिटर्न प्रदान करता है।

धन्यवाद।

+0

कृपया किसी को उत्तर दें = / – holms

उत्तर

0

If you look at the CRSF token source: you can see that all the csrf_middleware does it check the cookie against the post value. आपको पोस्ट सर्वर को अपने सर्वर पर वापस लाने की आवश्यकता है क्योंकि कुकी को पहले से ही एजेक्स के सेट पर सेट किया जाना चाहिए। If you look at the template tag source you can see that it is just taking the variable out of the context. या तो इसे संदर्भ से बाहर खींचकर अपनी प्रतिक्रिया में चिपकाएं या calling the context processor directly. अब आपको इसे POST चर crsf_token के रूप में वापस भेजने की आवश्यकता है।

0

आइए कहें, फ्रंटेंड में डोमेन frontend.example.com है, और बैकएंड डोमेन backend.example.com है। (यदि आप Django आराम ढांचे की तरह कुछ हैं) यदि आप उपयोग कर सकते हैं तो सुरक्षा परत I.e। को सक्षम करने के दो तरीके हैं। CSRF संरक्षण या CORS

CORS के लिए,

pip install django-cors-headers 

और फिर INSTALLED_APPS, MIDDLEWARE_CLASSES को यह विन्यस्त और CORS_ORIGIN_WHITELIST को दृश्यपटल डोमेन जोड़ें।

CORS_ORIGIN_WHITELIST = (
    'frontend.example.com' 
) 

CORS

CSRF_COOKIE_DOMAIN = ".mydomain.com" 

frontend.example.com


CSRF के लिए के अलावा अन्य किसी भी डोमेन से उत्पन्न किसी भी http अनुरोध को अवरुद्ध कर देगा, और यदि आप एक कोणीय App का उपयोग कर रहे हैं, नीचे की तरह करें,

$httpProvider.defaults.xsrfCookieName = 'csrftoken'; 
$httpProvider.defaults.xsrfHeaderName = 'X-CSRFToken'; 
$httpProvider.defaults.withCredentials = true; 

और उसके बाद http अनुरोध करते समय शीर्षलेख जोड़ें।

headers : { 
    "x-csrftoken" : $cookies.csrftoken 
} 
संबंधित मुद्दे