2014-10-29 11 views
23

मैं Django 1.7 और django-rest-framework का उपयोग कर रहा हूं।सीएसआरएफ असफल: सीएसआरएफ टोकन गुम या गलत

मैं एक एपीआई कि मुझे देता है इस डाल कुछ JSON डेटा मेरी settings.py

REST_FRAMEWORK = { 
    'DEFAULT_PERMISSION_CLASSES': ('rest_framework.permissions.AllowAny',), 
    'DEFAULT_RENDERER_CLASSES': (
    # 'rest_framework.renderers.XMLRenderer', 
    'rest_framework.renderers.JSONRenderer', 
    # 'rest_framework.renderers.BrowsableAPIRenderer', 
    ) 
} 

में जब मैं कॉल मिलता है, यह मुझे देता है सभी डेटा, लेकिन जब मैं PUT/पैच के साथ की कोशिश मैं बनाया:

--------Response Headers--------- 
Status Code: 403 
Date: Wed, 29 Oct 2014 18:51:42 GMT 
Vary: Cookie 
Server: WSGIServer/0.1 Python/2.7.8 
Allow: GET, POST, PUT, PATCH, HEAD, OPTIONS 
X-Frame-Options: SAMEORIGIN 
Content-Type: application/json 
--------------------------------- 

--------Response Body----------- 
{"detail": "CSRF Failed: CSRF token missing or incorrect."} 
--------------------------------- 

यह तब होता है जब मैं लॉग इन हूं, अगर मैं अज्ञात हूं तो मैं सही ढंग से पुट/पैच कर सकता हूं।

मैं @csrf_exempt साथ की कोशिश की है और मैं त्रुटियों मिल गया, मैं स्थापित करने में rest_framework.permissions.AllowAny ...

को शामिल किया है मुझे पता नहीं क्या हो रहा है है। क्या किसी को पता है कि मुद्दा क्या है?

उत्तर

32

जब आप SessionAuthentication का उपयोग कर रहे हैं, तो आप Django के प्रमाणीकरण का उपयोग कर रहे हैं, जिसे आमतौर पर सीएसआरएफ की जांच की आवश्यकता होती है। Django REST Framework इसे लागू करता है, केवल SessionAuthentication के लिए, इसलिए आपको X-CSRFToken शीर्षलेख में सीएसआरएफ टोकन पास करना होगा।

Django documentation jQuery का उपयोग करके सीएसआरएफ टोकन को पुनर्प्राप्त करने और अनुरोधों में भेजने पर अधिक जानकारी प्रदान करता है। सीएसआरएफ टोकन को csrftoken नामक कुकी के रूप में सहेजा जाता है जिसे आप HTTP प्रतिक्रिया से पुनर्प्राप्त कर सकते हैं, जो कि इस्तेमाल होने वाली भाषा के आधार पर भिन्न होता है।

यदि आप सीएसआरएफ कुकी को पुनर्प्राप्त नहीं कर सकते हैं, तो यह आमतौर पर एक संकेत है कि आपको SessionAuthentication का उपयोग नहीं करना चाहिए। मैं आपकी आवश्यकताओं के आधार पर TokenAuthentication या OAuth 2.0 में देखने की अनुशंसा करता हूं।

+1

मैं जानता हूँ कि मैं CSRF टोकन देना चाहिए जब मैं प्रमाणीकृत रहा हूँ, लेकिन, वास्तव में मैं एक .NET Windows Forms उपयोग कर रहा हूँ इस एपीआई के साथ संवाद करने के लिए आवेदन, और यह HTTPRequest और HTTPResponse विधियों द्वारा GET कॉल करता है, मुझे नहीं पता कि मैं इस स्थिति में सीएसआरएफ टोकन कैसे प्राप्त कर सकता हूं, मैं AJAX और न ही HTML फॉर्म का उपयोग नहीं कर रहा हूं। ** संपादित करें ** .NET ऐप को JSON प्रारूप में सादा पाठ प्राप्त होता है, और यह वही –

+0

लौटाता है आप कुकी के साथ मैं csrftoken को संभाल सकता हूं और उसे हेडर डेटा में वापस रख सकता हूं, इसलिए मैं PUT कर सकता हूं/अगर मैं लॉग इन हूं तो पैच कॉल करें। धन्यवाद! –

+0

@AlexLordMordor क्या आप कृपया अपना समाधान थोड़ा सा समझा सकते हैं? और जब आप लॉग-इन उपयोगकर्ता थे तो यह क्यों काम नहीं करता था, लेकिन बेनामी तरीकों से यह काम करता था। (मेरे पास बिल्कुल वही समस्या है) –

0

मैं इसी तरह की समस्या नहीं है, मैं अपने URL csrf_exempt पद्धति के तहत लिपटे लिया है के रूप में -

from django.views.decorators.csrf import csrf_exempt 

url(r'^api/v1/some-resource$', csrf_exempt(SomeApiView.as_view())), 
संबंधित मुद्दे