2015-09-18 13 views
5

मैं अपनी साइट पर सामाजिक लॉगिन सत्र प्रमाणीकरण की अनुमति देने के लिए django-oneall का उपयोग कर रहा हूं। हालांकि यह django-rest-framework के लिए सुझाए गए लेखकों में से एक नहीं है, rest_framework.authentication.SessionAuthentication django के डिफ़ॉल्ट सत्र प्रमाणीकरण का उपयोग करता है। तो मैंने सोचा कि यह एकीकृत करने के लिए काफी सरल होना चाहिए।पोस्ट पर 403 प्रतिक्रिया लौटने पर डीजेंगो-रेस्ट-फ्रेमवर्क, अनुमति दें, अनुमति दें अनुमति दें

अनुमतियों की तरफ, आखिरकार मैं IsAdmin का उपयोग करूंगा, लेकिन विकास के उद्देश्यों के लिए, मैंने इसे IsAuthenticated पर सेट किया था। जब वह 403 लौट रहा था, तो मैंने AllowAny पर अनुमतियों को आराम दिया, लेकिन अभी भी कोई पासा नहीं है।

settings.py

REST_FRAMEWORK = { 
    'DEFAULT_AUTHENTICATION_CLASSES': (
     'rest_framework.authentication.SessionAuthentication', 
    ), 
    'DEFAULT_PERMISSION_CLASSES': (
     'rest_framework.permissions.AllowAny', 
     # 'rest_framework.permissions.IsAuthenticated', 
     # 'rest_framework.permissions.IsAdminUser', 
    ), 
    'PAGE_SIZE': 100, 
    'DEFAULT_FILTER_BACKENDS': (
     'rest_framework.filters.DjangoFilterBackend', 
    ), 
} 

संपादित करें:

लिए मैंने नीचे उत्तर के आधार पर कार्य कर ली यहाँ मेरी बाकी ढांचे config है। यह पता चला है कि rest_framework दोनों csrftoken कुकी और एक X-CSRFToken समान मूल्य के शीर्षलेख की अपेक्षा करता है, मैंने अपने एजेक्स अनुरोधों के लिए हेडर भेजने के लिए अपना फ्रंट-एंड कोड सेट किया और सब ठीक काम किया।

उत्तर

13

Django बाकी फ्रेमवर्क स्थिति कोड 403 रिटर्न प्रासंगिक परिस्थितियों के एक जोड़े के तहत:।

  • आप (आवश्यक अनुमति स्तर की जरूरत नहीं है, उदा एक अप्रमाणित उपयोगकर्ता जब DEFAULT_PERMISSION_CLASSES('rest_framework.permissions.IsAuthenticated',) है के रूप में एक API अनुरोध करने
  • जब आप एक असुरक्षित अनुरोध प्रकार कर (पोस्ट, डाल, PATCH या हटाएँ - एक अनुरोध दुष्प्रभाव हो जाना चाहिए कि), तो आपको rest_framework.authentication.SessionAuthentication का उपयोग कर रहे हैं और आप requeset में अपने CSRFToken शामिल नहीं किया है
  • जब आप कर रहे हैं। एक असुरक्षित अनुरोध प्रकार और CSRFToken जो आपने शामिल किया है अब मान्य नहीं है।

मैं एक परीक्षण एपीआई के खिलाफ कुछ डेमो अनुरोध करने जा रहा हूं ताकि आप प्रत्येक समस्या का निदान करने में सहायता कर सकें और यह बताएं कि इसे कैसे हल किया जाए। मैं requests लाइब्रेरी का उपयोग करूँगा।

परीक्षण एपीआई

मैं एक मॉडल, Life, कि (42 का डिफ़ॉल्ट मान के साथ, answer) एक एकल फ़ील्ड के साथ एक बहुत ही सरल डीआरएफ एपीआई की स्थापना की। यहां से सब कुछ बहुत सीधे आगे है; मैंने ModelSerializer - LifeSerializer, ModelViewSet - LifeViewSet, और URL मार्ग पर DefaultRouter सेट अप किया है। मैंने डीआरएफ को कॉन्फ़िगर किया है ताकि उपयोगकर्ता को एपीआई का उपयोग करने के लिए प्रमाणित किया जा सके और SessionAuthentication का उपयोग किया जा सके।

एपीआई

import json 
import requests 

response = requests.get('http://localhost:8000/life/1/') 
# prints (403, '{"detail":"Authentication credentials were not provided."}') 
print response.status_code, response.content 

my_session_id = 'mph3eugf0gh5hyzc8glvrt79r2sd6xu6' 
cookies = {} 
cookies['sessionid'] = my_session_id 
response = requests.get('http://localhost:8000/life/1/', 
         cookies=cookies) 
# prints (200, '{"id":1,"answer":42}') 
print response.status_code, response.content 

data = json.dumps({'answer': 24}) 
headers = {'content-type': 'application/json'} 
response = requests.put('http://localhost:8000/life/1/', 
         data=data, headers=headers, 
         cookies=cookies) 
# prints (403, '{"detail":"CSRF Failed: CSRF cookie not set."}') 
print response.status_code, response.content 

# Let's grab a valid csrftoken 
html_response = requests.get('http://localhost:8000/life/1/', 
          headers={'accept': 'text/html'}, 
          cookies=cookies) 
cookies['csrftoken'] = html_response.cookies['csrftoken'] 
response = requests.put('http://localhost:8000/life/1/', 
         data=data, headers=headers, 
         cookies=cookies) 
# prints (403, '{"detail":"CSRF Failed: CSRF token missing or incorrect."}') 
print response.status_code, response.content 

headers['X-CSRFToken'] = cookies['csrftoken'] 
response = requests.put('http://localhost:8000/life/1/', 
         data=data, headers=headers, 
         cookies=cookies) 
# prints (200, '{"id":1,"answer":24}') 
print response.status_code, response.content 
+0

हम्म ... मेरी एंबर एप्लिकेशन वास्तव में अनुरोध में CSRF कुकी गुजर रहा है साधते। मेरे पास मेरे आराम एपीआई के लिए अपाचे में एक रिवर्स प्रॉक्सी सेटअप है। शायद मुझे किसी भी तरह से मेरी रिवर्स प्रॉक्सी को संशोधित करने की आवश्यकता है, इसलिए यह csrf कुकी मान को 'HTTP_X_CSRFTOKEN' शीर्षलेख में कॉपी करता है? – ckot

+0

मुझे लगता है कि मुझे हेडर में हमेशा csrftoken कुकी मान को पास करने के लिए एम्बर को कॉन्फ़िगर करना चाहिए। यह आसान होना चाहिए। – ckot

+1

@ कॉट मैंने अपना जवाब अपडेट कर लिया है। भूल गए कि हेडर 'एक्स-सीएसआरएफटीकेन' और कुकी 'csrftoken' दोनों सेट किए जाने थे। – chucksmash

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