2013-08-20 4 views
9

में सेट नहीं किए जा रहे हैं मैं एक डीजेएनजीओ + एंगुलरजेएस एप्लीकेशन विकसित कर रहा हूं, जहां कोणीय भाग django द्वारा नहीं किया जा रहा है।XSRF शीर्षलेख AngularJS

myApp = angular.module('myApp', []) 

myApp.config(['$httpProvider', 
    function(provider){ 
    provider.defaults.xsrfCookieName = 'csrftoken'; 
    provider.defaults.xsrfHeaderName = 'X-CSRFToken'; 
} 

फिर, किसी भी पोस्ट करने से पहले, मैं एक प्राप्त जो कुकी सेट करें:

इस प्रकार मैं कोणीय $httpProvider निर्धारित किया है। मैं क्रोम के माध्यम से इस बात की पुष्टि कर सकते हैं कि कुकी सेट है:

set-cookie:csrftoken=hg88ZZFEdLPnwDdN1eiNquA8YzTySdQO; expires=Tue, 19-Aug-2014 12:26:35 GMT; Max-Age=31449600; Path=/ 

हालांकि जब मैं एक पोस्ट करते हैं, कोई X-CSRFToken हैडर स्थापित किया जा रहा है (यह में संसाधनों/कुकीज़/Chrome डेवलपर टूल में स्थानीय होस्ट दृश्यमान हो)

इस पोस्ट के रूप में क्रोम द्वारा दर्ज की गई है:

POST /data/activities/search HTTP/1.1 
Host: localhost:14080 
Connection: keep-alive 
Content-Length: 2 
Accept: application/json, text/plain, */* 
Origin: http://localhost:14080 
X-Requested-With: XMLHttpRequest 
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.95 Safari/537.36 
Content-Type: application/json;charset=UTF-8 
Referer: http://localhost:14080/public/html/main.html?codekitCB=398694184.799418 
Accept-Encoding: gzip,deflate,sdch 
Accept-Language: en-US,en;q=0.8 
Cookie: csrftoken=hg88ZZFEdLPnwDdN1eiNquA8YzTySdQO 

क्यों नहीं हैडर स्थापित किया जा रहा है? इस कार्यक्षमता को सक्रिय करने के लिए मुझे और क्या करना चाहिए?

(ओर ध्यान दें: अगर मैं मैन्युअल रूप से $ http() कॉल में हेडर पास, पोस्ट अनुरोध ठीक काम करता है .. इसलिए समस्या वास्तव में नहीं AngularJS द्वारा सेट किए जाने शीर्षक है)

+0

मैं 1.0.8 का उपयोग कर रहा था, लेकिन मुझे पता चला यह रिलीज 1.2.0 – luca

उत्तर

8

बहुत ही सरल जवाब: यह केवल संस्करण 1.2.0 से उपलब्ध है, जो फिलहाल एक रिलीज उम्मीदवार है।

+0

से ही उपलब्ध है और यह जवाब बहुत गलत है, क्योंकि मैं इसे 1.1.5 में उपयोग करता हूं। –

+0

@OZ_ और 1.1.5 कहता है, 1.0.x :) –

+1

नहीं, यह सही है, नया स्वचालित तरीका (इस प्रश्न का एक वस्तु) केवल कोणीय 1.2 से है, आप इसे मैन्युअल रूप से कर रहे हैं (जो अभी भी उपयोगी हो) – luca

1
app.config(["$httpProvider", function($httpProvider) { 
    var csrfToken = getCookie('csrftoken'); 
    $httpProvider.defaults.headers.common['X-CSRFToken'] = csrfToken; 
}]) 

getCookie() से https://docs.djangoproject.com/en/dev/ref/contrib/csrf/


प्रत्येक विधि लेने के लिए या सेट अलग

$httpProvider.defaults.headers.post['X-CS.... 
$httpProvider.defaults.headers.get['X-CS.... 
5

1.2.0 अद्यतन मेरे लिए पर्याप्त जब Safari या Firefox (क्रोम का उपयोग नहीं किया गया था हर समय बस ठीक काम कर रहा था)। सफारी और फ़ायरफ़ॉक्स के साथ समस्या यह थी कि Django बैकएंड ने HTTP प्रतिक्रिया में csrf-cookie नहीं भेजा था।

मुझे जो करना था, वह मेरे दृश्य समारोह में @ensure_csrf_cookie सजावटी को जोड़ना था जो Angularjs के लिए पृष्ठ बनाता है।

@ensure_csrf_token 
def my_view(request): 
    ... 

और जावास्क्रिप्ट फ़ाइल में:

myApp.config(function($httpProvider) { 
    $httpProvider.defaults.xsrfCookieName = 'csrftoken'; 
    $httpProvider.defaults.xsrfHeaderName = 'X-CSRFToken'; 
} 

कम से कम अब के लिए मुझे पता नहीं क्यों क्रोम इसके बिना काम करता है लेकिन अन्य ब्राउज़रों नहीं करते हैं।

+0

आप @ensure_csrf_token कैसे आयात करते हैं? –

+0

उह, मुझे लगता है कि मेरे पास उदाहरण में एक टाइपो है। यह @ensure_csrf_cookie है जो django.views.decorators.csrf.ensure_csrf_cookie – Janne

2

मुझे एक समान समस्या थी और यह मेरी गलती से शर्मनाक था।

मेरे गलती:

$.post('/url', data) 

सुनिश्चित करें कि आप $http वस्तु उपयोग कर रहे हैं!

$http.post('/url', data) 

यह पूर्व को छोड़कर, बहुत बाद से दोनों एक दूसरे के रूप में समान रूप से के रूप में अच्छी तरह से काम करने लगते हैं इस गलती के लिए आसान था $http.defaults.headers.common['X-CSRFToken'], आदि पर गौर नहीं करता

+0

हे में पाया जा सकता है। अच्छा लेख। मैंने यह नहीं किया है लेकिन यह मुझे गुदगुदी करता है। अपने लाल चेहरे के क्षणों को साझा करने के लिए बढ़िया! – ErichBSchulz

1

कोणीय परिवर्तन अक्सर अक्सर और कुछ उत्तरों नवीनतम संस्करणों के साथ काम नहीं करते हैं। किसी भी तरह से, के बाद से कोणीय एक XSRF-TOKEN कुकी नाम की उम्मीद है, और एक X-XSRF-TOKEN हेडर भेजता है, हम वैकल्पिक रूप से बस Django डिफ़ॉल्ट रूप से इन उपयोग करने के लिए बता सकते हैं:

CSRF_COOKIE_NAME = 'XSRF-TOKEN' 
CSRF_HEADER_NAME = 'HTTP_X_XSRF_TOKEN' 

पहले सेटिंग (docs देखें) के लिए कुकी नाम है सीएसआरएफ टोकन, जबकि दूसरा (देखें docs, केवल 1.9 में पेश किया गया) संबंधित हेडर नाम है।

अंतिम, बस संदर्भ के लिए, स्थापित करने के लिए भूल जाते हैं नहीं है:

CSRF_COOKIE_HTTPONLY = False