2012-05-24 13 views
38

मैं लॉग इन सेवा के लिए Omniauth के साथ एक रेल एप्लिकेशन बना रहा हूं। Google को प्रमाणित करने के लिए मैं OmniAuth Google OAuth2 Strategy का उपयोग कर रहा हूं।OmniAuth को कैसे बचाएं :: रणनीतियां :: OAuth2 :: CallbackError?

जब उपयोगकर्ता 'पहुंच की अनुमति' बटन पर क्लिक करता है तो सब ठीक काम करता है। लेकिन जब उपयोगकर्ता 'धन्यवाद' बटन पर क्लिक करता है तो नीचे दी गई त्रुटि उठाई जाती है।

OmniAuth::Strategies::OAuth2::CallbackError 

मैंने एप्लिकेशन नियंत्रक में नीचे बचाव कोड जोड़ने का प्रयास किया है।

class ApplicationController < ActionController::Base 
    rescue_from OmniAuth::Strategies::OAuth2::CallbackError, :with => 
    :omniauth_callback_error_handler 

protected 

def omniauth_callback_error_handler 
    redirect_to init_sign_in_users_path 
end 
end 

लेकिन कोई भाग्य नहीं।

कोई विचार?

धन्यवाद :)

उत्तर

32

यह इसलिए होता है क्योंकि प्रमाणीकरण एक मिडलवेयर में होता है तो अपने नियंत्रक इसमें शामिल नहीं है। यह where the exception is raised है और कहा जाता है कोड this

है मुझे लगता है कि आप अन्यथा नहीं है a commit के तीन महीने पहले कोड

Omniauth.config do |config| 
    config.on_failure do 
    # your handling code invoked in the context of a rack app 
    end 
end 

इस तरह से Omniauth प्रारंभकर्ता में एक कॉलबैक को परिभाषित करते हुए त्रुटि इस तरह संभाल कर सकते हैं जो इस व्यवहार

def redirect_to_failure 
    message_key = env['omniauth.error.type'] 
    new_path = "#{env['SCRIPT_NAME']}#{OmniAuth.config.path_prefix}/failure?message=#{message_key}" 
    Rack::Response.new(["302 Moved"], 302, 'Location' => new_path).finish 
end 

जिसमें कहा गया है कि त्रुटियों पर अपने उपयोगकर्ता एक त्रुटि संदेश के साथ /auth/failure पर भेज दिया जाएगा पेश करते हैं, तो आप के लिए एक मार्ग को परिभाषित करने में सक्षम होना चाहिए वह रास्ता और इसे अपने ऐप में संभाल लें। ध्यान रखें कि यह in development mode नहीं होगा, इसलिए आपको अन्य envs में इसे आजमाने की आवश्यकता है। यदि उत्पादन में ऐसा नहीं होता है तो अपने omniauth मणि ​​को संस्करण 1.1.0

+16

1000.times.do कहते हैं "आपको बहुत बहुत धन्यवाद!" अंत –

+1

मेरे पास विकास मोड में यह व्यवहार है .. – simo

+2

मुझे यह 'ओमनीउथ' के बजाय 'ओमनीउथ' का उपयोग करके काम करना पड़ा। ऐसा लगता है कि पूंजीकरण बदल गया है। – tyler

16

पर अपग्रेड करने का प्रयास करें मैंने इस समस्या को फैबियो के पहले सुझाव के साथ हल किया है।

OmniAuth.config.on_failure = Proc.new do |env| 
    UsersController.action(:omniauth_failure).call(env) 
    #this will invoke the omniauth_failure action in UsersController. 
end 

मेरी UsersController में

class UsersController < ActionController::Base 
    def omniauth_failure 
    redirect_to init_sign_in_users_path 
    #redirect wherever you want. 
    end 
end 
+4

मुझे उस उपरोक्त कोड को कहां रखना है Omniauth.config.on_failure = Proc.new do | env | "उपयोगकर्ता नियंत्रक" .constantize.action (: omniauth_failure) .call (env) # यह उपयोगकर्ता नियंत्रक में omniauth_failure कार्रवाई का आह्वान करेगा। अंत – regmiprem

+2

कोड को कॉन्फ़िगर/प्रारंभकर्ता/omniauth_failure_callback.rb फ़ाइल में डालें। मेरा सुझाव है कि आप पीटर के कोड का उपयोग वास्तव में साफ करें। –

+2

@ सैंडार, हालांकि पीटर का कोड क्लीनर है, आपका कोड विकास पर्यावरण में अपेक्षित विकास पर्यावरण में काम करता है। तो आपके उत्तर में भी +1 करें। – mcmlxxxiii

61

आप एक और भी क्लीनर फैशन में omniauth प्रारंभकर्ता में on_failure proc सेट कर सकते हैं:

OmniAuth.config.on_failure = UsersController.action(:oauth_failure) 
+4

+1 में बदलें। –

+1

इस स्वच्छ समाधान के लिए धन्यवाद! ;) – Dmitri

+3

यह कोड उत्पादन evironment में महान काम करता है। हालांकि, यदि आप विकास पर्यावरण में अपने उपयोगकर्ता नियंत्रक # oauth_failure कोड को बदलते हैं, तो आपको कोई भी परिवर्तन दिखाई नहीं देगा। प्रो पर आधारित ध्वनि का कोड विकास में बेहतर है और विकास में अपेक्षित काम करता है। – mcmlxxxiii

0

वहाँ एक विन्यास एक को ऊपर उठाने के बजाय /auth/failure उपयोग करने के लिए है त्रुटि।

def call 
    raise_out! if OmniAuth.config.failure_raise_out_environments.include?(ENV['RACK_ENV'].to_s) 
    redirect_to_failure 
end 

और failure_raise_out_environmentshere परिभाषित किया गया है:

मैं OmniAuth 1.2.2 का उपयोग करें और जब मैं FailureEndpoint जाँच मैं कोड पाया this की तरह है

def self.defaults 
    @defaults ||= { 
    # other configurations 
    :failure_raise_out_environments => ['development'] 
    } 
end 

वातावरण विन्यस्त किया जा सकता तो समाधान आसान है। मैं रेल तो मैं एक प्रारंभकर्ता फ़ाइल में कोड के नीचे डाल का उपयोग करें:

OmniAuth.configure do |config| 
    # Always use /auth/failure in any environment 
    config.failure_raise_out_environments = [] 
end 
संबंधित मुद्दे