मेरे पास एक एकल पृष्ठ ऐप है जो CORS का उपयोग करके किसी अन्य डोमेन को प्रमाणित करता है। सभी अनुरोध JSON अनुरोध हैं।"चेतावनी: सीएसआरएफ टोकन प्रामाणिकता को सत्यापित नहीं कर सकता" त्रुटि - देवताओं के साथ सीओआरएस और: टोकन_authenticatable
मेरा ऐप ठीक से प्रमाणित कर सकता है और जीईटी अनुरोध ठीक कर सकता है। प्रमाणीकरण टोकन_authenticatable का उपयोग कर रहा है। अर्थात। सभी अनुरोधों को संलग्न
तो, मेरे वास्तविक समस्या यह है कि जब मैं एक PUT अनुरोध मैं एक चेतावनी प्राप्त करने की कोशिश है 'auth_token = जो कुछ भी?': CSRF टोकन प्रामाणिकता सत्यापित नहीं कर सकता रेल में संदेश लॉग इन करें और साथ ही कैनकन :: एक्सेसडेन (आप इस पृष्ठ तक पहुंचने के लिए अधिकृत नहीं हैं।) अपवाद।
रेल नियंत्रक को बस skip_before_filter :verify_authenticity_token
जोड़ना समस्या को हल करता है।
इसलिए मैं केवल यह निष्कर्ष निकाल सकता हूं कि मेरे AJAX अनुरोध अमान्य या खाली csrf_token भेज रहे हैं।
मुझे वास्तव में यह नहीं पता कि यह कैसे हो सकता है, क्योंकि मुझे विश्वास है कि मैं प्रत्येक AJAX अनुरोध के साथ सही ढंग से एक्स-सीएसआरएफ-टोकन हेडर भेज रहा हूं।
मूल रूप से, मेरे ऐप प्रमाणित करता है और वसीयत एक auth_token और एक csrf_token वापस भेजता है:
render :status => 200, :json => {
:auth_token => @user.authentication_token,
:csrf_token => form_authenticity_token
}
मैं तो मेरे ajax ऐप्लिकेशन में उन टोकन की दुकान, और jQuery में ajaxSend
का उपयोग कर, इसे सेट अप तो jQuery उन टोकन गुजरता प्रत्येक अनुरोध के साथ:
initialize: ->
@bindTo $(document), 'ajaxSend', @appendTokensToRequest
appendTokensToRequest: (event, jqXHR, options) ->
if not @authToken? then return
if @csrfToken?
jqXHR.setRequestHeader 'X-CSRF-Token', @csrfToken
if options.type is 'POST'
options.data = options.data + (if options.data.match(/\=/) then '&' else '') +
$.param auth_token:@authToken
else
options.url = options.url + (if options.url.match(/\?/) then '&' else '?') +
$.param auth_token:@authToken
मैं तो क्रोम नेटवर्क टैब में देख सकते हैं, प्रत्येक के लिए उस अनुरोध auth_token
परम भेजा जा रहा है, साथ ही X-CSRF-Token
हेडर प्राप्त।
पुट अनुरोधों पर हालांकि यह काम नहीं कर रहा है।
मेरा सिद्धांत यह है कि सीओआरएस चीजों को भर रहा है। यदि आप एक सीओआरएस अनुरोध करते हैं, तो आपका ब्राउज़र वास्तव में अतिरिक्त विकल्प अनुरोध करता है कि यह जांचने के लिए कि आपको इस संसाधन तक पहुंचने की अनुमति है।
मुझे संदेह है कि यह विकल्प अनुरोध है जो एक्स-सीएसआरएफ-टोकन हेडर को पार नहीं कर रहा है, इस प्रकार रेल रेलवे के अंत में तुरंत csrf_token को अमान्य कर देता है। फिर जब jQuery वास्तविक PUT अनुरोध करता है तो csrf_token यह गुजरता है अब मान्य नहीं है।
क्या यह समस्या हो सकती है?
यह साबित करने के लिए मैं क्या कर सकता हूं? क्रोम मुझे समस्या को डीबग करने में मदद के लिए नेटवर्क टैब में विकल्प अनुरोध नहीं दिखा रहा है।
यह एक बड़ा मुद्दा नहीं है, क्योंकि मैं केवल सीएसआरएफ सामान बंद कर सकता हूं। लेकिन मैं जानना चाहता हूं कि यह क्यों काम नहीं कर रहा है।
हाँ, मुझे पता है कि मुझे सीएसआरएफ टोकन पास करने की आवश्यकता है। मैंने कहा था कि मैं एक्स-सीएसआरएफ-टोकन हेडर के रास्ते में इसे पार कर रहा था। इसलिए मुझे नहीं पता कि मुझे चेतावनी संदेश क्यों मिलेगा। मैंने सोचा कि यह विकल्प अनुरोध के साथ कुछ ऐसा हो सकता है जो उस शीर्षलेख में दिखाई नहीं दे रहा था। – asgeo1