2012-10-24 13 views
5

मेरे पास एक एकल पृष्ठ ऐप है जो 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 यह गुजरता है अब मान्य नहीं है।

क्या यह समस्या हो सकती है?

यह साबित करने के लिए मैं क्या कर सकता हूं? क्रोम मुझे समस्या को डीबग करने में मदद के लिए नेटवर्क टैब में विकल्प अनुरोध नहीं दिखा रहा है।

यह एक बड़ा मुद्दा नहीं है, क्योंकि मैं केवल सीएसआरएफ सामान बंद कर सकता हूं। लेकिन मैं जानना चाहता हूं कि यह क्यों काम नहीं कर रहा है।

उत्तर

0

रेल में प्रत्येक फॉर्म जमा करने के लिए सीएसआरएफ टोकन प्रामाणिकता की आवश्यकता होती है। यह फॉर्म को सुरक्षित रूप से सबमिट करने के लिए उपयोग करता है। सीएसआरएफ टोकन (प्रत्येक बार) जब हम अपना आवेदन खोलेंगे तो रेल में नए बनाएंगे। यदि हमारे नियंत्रक के अंदर सीएसआरएफ टोकन गुजर नहीं रहा है तो यह चेतावनी दिखाएगी। हमें सभी फॉर्म सबमिशन में इस टोकन को पास करने की आवश्यकता है।

+0

हाँ, मुझे पता है कि मुझे सीएसआरएफ टोकन पास करने की आवश्यकता है। मैंने कहा था कि मैं एक्स-सीएसआरएफ-टोकन हेडर के रास्ते में इसे पार कर रहा था। इसलिए मुझे नहीं पता कि मुझे चेतावनी संदेश क्यों मिलेगा। मैंने सोचा कि यह विकल्प अनुरोध के साथ कुछ ऐसा हो सकता है जो उस शीर्षलेख में दिखाई नहीं दे रहा था। – asgeo1

1

मुझे लगता है कि आपको विकल्प अनुरोधों को संभालने की आवश्यकता होगी, जो विभिन्न शीर्षकों के साथ प्रतिक्रिया देनी चाहिए जो सीओआरएस अनुरोध की अनुमति देंगे, आईआईआरसी वे एक्सेस-कंट्रोल-स्वीकृति-विधि, एक्सेस-कंट्रोल-रिक-उत्पत्ति और पहुंच-नियंत्रण-अनुमति देते हैं-हेडर। चूंकि विकल्प अनुरोध विफल हो रहा है, इसलिए संभवतः PUT अनुरोध नहीं हो रहा है।

+0

ठीक है मैंने फिर से पढ़ा ऐसा लगता है कि आपका पुट अनुरोध हो रहा है। मैं वैसे भी कोशिश करता हूँ। शायद विकल्प अनुरोध टोकन को अमान्य कर देता है, मैं व्यक्तिगत रूप से रेल के बारे में निश्चित नहीं हूं। लेकिन शायद विकल्प प्रतिक्रिया नए टोकन को किसी भी तरह इस्तेमाल करने के लिए भेज सकती है। – jamiebarrow

1

मैं बस एक ही मुद्दे में भाग गया। समस्या यह है कि _session_id कुकी को सीओआरएस में नहीं भेजा जा सकता है। नतीजतन, जब रेल टोकन को सत्यापित करने का प्रयास करता है, तो session[:_csrf_token]null है और रेल तुलना से पहले एक नया उत्पन्न करता है।

समस्या को हल करने के लिए, आपको CORS में कुकी भेजने में सक्षम होना चाहिए। यहां Mozilla Developer Network reference है। सर्वर और क्लाइंट पक्ष दोनों पर काम करने के लिए काम की आवश्यकता है।

ग्राहक - अपने क्लाइंट टेक्नोलॉजी दस्तावेज़ का संदर्भ लें।

सर्वर - preflight (HTTP विकल्प) कॉल के जवाब में हैडर Access-Control-Allow-Credentialstrue लिए (स्ट्रिंग) सेट करें।

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