2012-05-03 11 views
6

किसी को भी मदद कर सकते हैं मुझे इस समस्या की तह तक पहुंचने?सही नियंत्रक मार क्यों वसीयत नहीं है + Omniauth कॉलबैक?

मैं रेलवे 3.2 ऐप में डेविस + ओमनीउथ का उपयोग कर रहा हूं। मैं क्या जानना चाहता हूं, डेविस के user_omniauth_authorize_path(provider) विधि के दृश्यों के पीछे क्या हो रहा है।

मुझे रेक मार्गों और मणि के स्रोत के माध्यम से खुदाई हुई है, लेकिन मुझे कुछ भी स्पष्ट नहीं दिख रहा है जो मेरे पास समस्या का कारण बन जाएगा।

मुझे लगता है कि यह विधि बस प्रदाता के साइनइन यूआरएल (उदा। ट्विटर) को कॉल करती है और फिर रूट.आरबी में परिभाषित कॉलबैक पथ पर वापस आती है।

मेरी routes.rb में मैं

devise_for :users, :controllers => { :omniauth_callbacks => 'users/omniauth_callbacks'} 

devise_scope :user do 
    get '/users/auth/:provider' => 'users/omniauth_callbacks#passthru' 
end 

है उन में/omniauth_callbacks_controller.rb मैं

def twitter 
    render :text => "This works" 
end 

def passthru 
    render :text => "This doesn't work" 
end 

है एक दृश्य मैं <%= link_to "Twitter", user_omniauth_authorize_path(:twitter) %> है में। इस लिंक पर क्लिक करना ट्विटर पर जाता है जहां मैं लॉग इन कर सकता हूं, लेकिन मेरे ऐप पर लौटने पर मुझे एक त्रुटि मिलती है "आप पहले ही साइन इन हैं"।

मैं बाहर कैसे या क्यों इस त्रुटि उत्पन्न की जा रही है काम नहीं कर सकता। मुझे केवल "यह काम" देखना चाहिए या "यह काम नहीं करता"।

मेरे पास एक ही तरह से एक फेसबुक प्रदाता स्थापित है, और यह अपेक्षा के अनुसार काम करता है।

यदि मैं <a href="https://stackoverflow.com/users/auth/twitter">Twitter</a> के साथ डेविस के सर्वव्यापी लिंक को प्रतिस्थापित करता हूं तो मुझे "यह काम" मिलता है।

तो यह मेरी समस्या हल करता है, लेकिन यह आदर्श नहीं है और मैं जानना चाहता हूं क्यों।

किसी को भी किसी भी प्रकाश डाला सकता है?

संपादित

रैक मार्गों इस तरह दिखता है:

user_omniauth_callback  /users/auth/:action/callback(.:format)      users/omniauth_callbacks#(?-mix:twitter|facebook) 

उत्तर

1

ठीक है, यह मेरे लिए काम कर रहा है, तो यह निश्चित रूप से अपने अंत पर कुछ न कुछ है। सबसे पहले, आप कंसोल प्राप्त कॉल /users/auth/twitter और /users/auth/twitter?callback 2 अलग अलग तरीकों के द्वारा प्राप्त की तुलना में है? उन्हें बिल्कुल वही दिखना चाहिए (बेशक टोकन और सत्यापनकर्ता को छोड़कर)।

अब, मुझे यकीन नहीं है कि यह संबंधित है, लेकिन यह समझने के साथ कि आप पासथ्रू मार्ग का उपयोग नहीं करते हैं, इसलिए आप उस मार्ग को हटा सकते हैं। इसके बजाय, आपके कॉलबैक नियंत्रक में, आपको विफलता नामक एक क्रिया को कार्यान्वित करना चाहिए जो खराब अनुरोध को संभालता है। देवता के कार्यान्वयन के लिए See here

मैं यहाँ तिनके पर लोभी हूँ, लेकिन आप भी अपने कॉलबैक नियंत्रक के अंत में इस होना चाहिए:

# This is necessary since Rails 3.0.4 
# See https://github.com/intridea/omniauth/issues/185 
# and http://www.arailsdemo.com/posts/44 
protected 
def handle_unverified_request 
    true 
end 
+0

हाय askitaka, इन सुझावों के लिए धन्यवाद। मैं सिफारिशों के आधार पर 'पासथ्रू' का उपयोग कर रहा हूं https://github.com/plataformatec/devise/wiki/OmniAuth:-Overview और http://stackoverflow.com/questions/5531263/omniauth-doesnt-work-with-route -globbing-in-rails3 wrt मार्ग globbing। क्या यह अब सलाह नहीं दी जा रही है? वैसे भी, आपने मुझे सोचने के लिए कुछ नई चीजें दी हैं। धन्यवाद! मैं इसे आज़माउंगा और रिपोर्ट करूंगा। –

+0

हाय असितका, क्या आप जीईटी कॉल की तुलना करके इसका मतलब बता सकते हैं। मैंने कंसोल में 'app.get'/users/auth/twitter'' चलाया है। दोनों कॉल '302' लौटाते हैं, जिनकी अपेक्षा की जा सकती है। क्या इन कॉलों को अधिक जानकारी में जांचने का कोई तरीका है? या 302 रीडायरेक्ट का पालन करने के लिए? –

+0

दोह! इसके बारे में थोड़ा और सोचने के बाद, आप सही हैं। यह पासथरू समारोह था। मैं पासस्थु का उपयोग कर रहा हूं क्योंकि मेरे पास मार्गों में सभी को पकड़ है। आरबी। किसी और चीज पर काम करते समय, मैं इस प्रश्न को मेरे प्रश्न के अनुसार पाठ प्रस्तुत करने के लिए संपादित कर दूंगा। लेकिन इस नियंत्रक का उद्देश्य omniauth अनुरोधों पर 404 वापस करना है। पासस्ट्रू समारोह के बिना, omniauth बस काम नहीं करता है। अब थोड़ा बेवकूफ महसूस करें :) इस अष्टिका को इंगित करने के लिए धन्यवाद! –

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