2012-05-02 21 views
8

मैं अपने द्वारा लिखे गए रेल ऐप तक पहुंचने के लिए बाकी-क्लाइंट का उपयोग करने के साथ खेल रहा हूं। मैंने लॉग इन करने और पोस्ट अनुरोध करने के लिए एक त्वरित स्क्रिप्ट लिखी है। सबकुछ काम कर रहा है लेकिन मुझे इस तथ्य के चारों ओर काम करना पड़ा कि यदि आप जेसन में किसी फॉर्म के लिए अनुरोध करते हैं तो कोई प्रामाणिकता नहीं है। मुझे प्रामाणिकता_टोकन प्राप्त करने के लिए नियमित रूप से एचटीएमएल अनुरोध करना पड़ा और फिर इसे मेरे पोस्ट अनुरोध के हिस्से के रूप में सबमिट किए गए जेसन में शामिल किया गया। मूल रूप से मैं वहाँ json अनुरोधों के लिए CSRF संरक्षण बंद करने का विकल्प है, लेकिन मैं नहीं बल्कि ऐसा नहीं होगा नीचेएक रेल ऐप के लिए जेसन पोस्ट अनुरोधों के लिए सीएसआरएफ टोकन प्राप्त करना

private_resource = RestClient::Resource.new('https://mysite.com') 

params = {:user => {:email => '[email protected]', :password => 'please'}} 
#log in 
login_response = private_resource['users/sign_in'].post(params, :content_type => :json, :accept => :json) 
#get cookie 
cookie = login_response.cookies 
#get json 
json_response = private_resource['products/new'].get(:content_type => :json, :accept => :json, :cookies => cookie) 
#another request that returns html form with authenticity token 
response_with_token = private_resource['products/new'].get(:cookies => cookie) 
#extract token 
token = Nokogiri::XML(response_with_token).css('input[name=authenticity_token]').first.attr('value') 
#update cookie 
cookie = response_with_token.cookies 
#populate form and insert token 
form = JSON.parse(json_response) 
form['name'] = "my product" 
form['authenticity_token'] = token 
#submit the request 
private_resource['products'].post(form.to_json, {:cookies => cookie, :content_type => :json, :accept => :json}) 

एक की तरह एक त्वरित एक गंदा स्क्रिप्ट है। मैं मैकेनाइजेशन रूट या कुछ इसी तरह जा सकता था और फिर मैं सीएसआरएफ के साथ जेसन अनुरोधों के बारे में चिंता नहीं करता था, लेकिन मैं बस आराम से क्लाइंट

के साथ इस सामान को करने के साथ खेलना चाहता था, मुझे लगता है कि मैं जानना चाहता हूं कि क्या मुझे उत्सुकता है या नहीं वहाँ एक कारण है कि कोई authenticity_token json अनुरोधों के लिए पेश किया जाता है और मैं भी अगर वहाँ बहुत hacky दृष्टिकोण मैं यहाँ लिया है

उत्तर

8

अपने आवेदन में नीचे दिए गए कोड रखो से टोकन समस्या को हल करने के लिए एक बेहतर तरीका है सोच रहा हूँ नियंत्रक:

def verified_request? 
    if request.content_type == "application/json" 
     true 
    else 
     super() 
    end 
end 

और before_filter का उपयोग कर इस विधि कहते हैं।

अधिक जानकारी के लिए देखें: http://blog.technopathllc.com/2011/09/rails-31-csrf-token-authenticity-for.html

और रेल में इस मुद्दे की जांच: https://github.com/rails/rails/issues/3041

+1

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

+0

आपका स्वागत है ... हाँ सीएसआरएफ टोकन मुद्दे को पार करने का यही एकमात्र तरीका है। यदि आप अपने JSON अनुरोध के साथ टोकन पास करना चाहते हैं, तो आप हेडर का उपयोग कर सकते हैं: हेडर: { 'एक्स-सीएसआरएफ-टोकन': '<% = form_authenticity_token.to_s%>' } – swati

+0

चेक: http: // stackoverflow। कॉम/प्रश्न/7203304/चेतावनी-कैंट-सत्यापन-सीएसआरएफ-टोकन-प्रामाणिकता-रेल http://stackoverflow.com/questions/8503447/rails-how-to-add-csrf-protection-to-forms-created-in -javascript – swati

0

अपने app/views/products/new.json.jbuilder में, इस जोड़ें:

json.authenticity_token form_authenticity_token 

यह मान जा रहा है के साथ एक चाबी "authenticity_token" से जोड़ दिया जाएगा टोकन, तो आपके json_response में आपको टोकन भी मिलता है। this answer से आइडिया।