2014-04-17 9 views
5

मैं अपने सर्वर साइड फॉर्म सत्यापन के लिए एक परीक्षण लिखने की कोशिश कर रहा हूं लेकिन मुझे एक निषिद्ध त्रुटि मिल रही है। ऐसा लगता है कि इसे 2 कदम की प्रक्रिया की आवश्यकता है। चरण 1, फॉर्म से सीएसआरएफ मूल्य प्राप्त करें। चरण 2, फॉर्म हैंडलर पर पोस्ट करने के लिए सीएसआरएफ मान का उपयोग करें। हालांकि कोई फर्क नहीं पड़ता कि मैं पोस्ट करने का प्रयास कैसे करता हूं मुझे एक वर्जित त्रुटि मिलती है।सीएसआरएफ के साथ एक्सप्रेस फॉर्म पोस्ट का परीक्षण कैसे करें?

--full परीक्षण: https://github.com/socketwiz/swblog/blob/master/test/contact.js#L57-L100

मैं thusly निम्न पंक्ति को बदलने की कोशिश की है: https://github.com/socketwiz/swblog/blob/master/test/contact.js#L85

.send({name: 'foo', 'X-CSRF-Token': token}) 

.set('X-CSRF-Token', token) 

.set('Cookie', ['X-CSRF-Token=' + token]) 

लेकिन कुछ भी नहीं मैं कोशिश CSRF आवश्यकता को पूरा करने लगेगा। जितना अधिक मैं इसे अधिक जटिल कोशिश करता हूं, यह एक साधारण चीज़ की तरह दिखता है। शायद मैं इस सब गलत के बारे में जा रहा हूँ। कोई विचार?

+0

यह स्पष्ट कुछ भी करता है: यहाँ है कि मैं क्या के साथ आया है? http://jb.demonte.fr/blog/expressjs-angularjs-csrf/ – adrichman

+0

@adrichman, मुझे लगता है कि मुझे यह कहना चाहिए था कि यह मेरे फॉर्म से ठीक काम करता है, मैं सिर्फ यह नहीं समझ सकता कि परीक्षण कैसे लिखना है यह। जब परीक्षण पोस्ट करने का प्रयास करता है तो यह एक फोरबिडन त्रुटि प्राप्त करता है चाहे मैं कोशिश करता हूं :( – socketwiz

+0

मैं उस वाक्यविन्यास के बारे में निश्चित नहीं हूं जिसका आप संदर्भ दे रहे हैं, लेकिन ऐसा लगता है कि आपको रिफैक्टर करने की आवश्यकता हो सकती है ताकि आप विशेष रूप से 'x- csrf-token 'हेडर कुकी पर स्थित टोकन के बराबर है। – adrichman

उत्तर

11

धन्यवाद @ शॉनज़ू, आपने कुकीज़ पर टिप्पणी करने में मुझे यह जानने में मदद की कि मुझे क्या करना है। मुझे एक विचार था कि मैं इसे जटिल बना रहा था।

https://github.com/socketwiz/swblog/blob/master/test/contact.js

it('should not post just a name', function(done) { 
    request(mock) 
     .get('/contact') 
     .end(function(err, res){ 
     var $html = jQuery(res.text); 
     var csrf = $html.find('input[name=_csrf]').val(); 

     request(mock) 
      .post('/api/contact.json') 
      .set('cookie', res.headers['set-cookie']) 
      .send({ 
      _csrf: csrf, 
      name: 'Mary Jane' 
      }) 
      .expect(function(res){ 
      assert.equal(undefined, res.body.name); 
      assert.equal('You must provide a valid email address', res.body.email); 
      assert.equal('You must provide a message', res.body.message); 
      }) 
      .expect(500, done); 
     }); 
}); 
+0

यह वास्तव में शानदार है। मैं यह नहीं समझ सकता कि jQuery इस तरह चलाने के लिए कैसे प्राप्त करें। मैं नोड पर अपने परीक्षण चला रहा हूं और एक एक्सप्रेस ऐप का परीक्षण कर रहा हूं। तो मेरे पास वास्तव में एक पूर्ण दस्तावेज़ संरचना नहीं है। मैंने जोड़ा: var jQuery = आवश्यकता ('jQuery'); त्रुटि है: असकत त्रुटि: jQuery को दस्तावेज़ के साथ एक विंडो की आवश्यकता है – user2562923

+0

मुझे लगता है कि आपको कुछ चाहिए जेएसडम की तरह, इस प्रश्न के उत्तर की जांच करें: http://stackoverflow.com/questions/21358015/error-jquery-requires-a-window-with-a- दस्तावेज़ – socketwiz

+0

या कुकी को बेहतर तरीके से सीएसआरएफ टोकन कैसे प्राप्त करें इस पर जांचें: http://stackoverflow.com/questions/18773846/how-to-test-endpoints- संरक्षित-by-csrf-in-node-js- व्यक्त – Wtower

2

एक्सप्रेस सीएसआरएफ मिडलवेयर सीएसआरएफ टोकन को सत्यापित करने के लिए सत्र में एक रहस्य बचाता है, जबकि मुझे लगता है कि आप सत्र स्टोर के रूप में cookieSession मिडलवेयर का उपयोग करते हैं। इसलिए सीएसआरएफ टोकन के साथ डेटा पोस्ट करते समय आपको सत्र कुकीज़ को फिर से भेजने की आवश्यकता है, एक्सप्रेस आपके सीएसआरएफ टोकन को सत्यापित करने के लिए सत्र में गुप्त का उपयोग कर सकता है।

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