2012-05-24 13 views
38

私はを使っています。OmniAuth :: Strategies :: 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

あなたのコントローラがそれに関与していないので、認証はミドルウェアに起こるので、これが起こります。私はあなたがそうでなければa commitの3ヶ月前にあり、コード

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

のこの種のOmniauth初期化子でのコールバックを定義することによって、この種のエラーを処理することができると思うこれはwhere the exception is raisedであると呼ばれるコードがthis

ありますエラー時にユーザーがエラーメッセージを表示して/auth/failureにリダイレクトされていることを述べて、この動作

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 

を紹介し、あなたがのためのルートを定義することができるはずですそのパスとあなたのアプリでそれを処理します。これが起こらないことを覚えておいてくださいin development mode他のenvsで試してみる必要があります。これがプロダクションで起こらない場合は、omniauth gemをバージョン1.1.0にアップグレードしてください。

+16

1000xdo puts「非常にありがとう!" end –

+1

私は開発モードでこの動作をしています。 – simo

+2

「Omniauth」ではなく「OmniAuth」を使用していますが、大文字と小文字の区別があります。 – tyler

16

私はFabioの最初の提案でこの問題を解決しました。あなたもきれいな方法でomniauth初期化子でon_failure procを設定することができます

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 | "UsersController" .constantize.action(:omniauth_failure).call(env) #this UsersControllerでomniauth_failureアクションを呼び出します。 end – regmiprem

+2

は、コードをconfig/initializers/omniauth_failure_callback.rbファイルに置きます。ピーターのコードを本当にクリーンなものとして使うことをお勧めします。 –

+2

@soundarでは、ピーターのコードはより洗練されていますが、コードは開発環境で期待通りに開発環境で動作します。あなたの答えに+1してください。 – mcmlxxxiii

61

私がUserControllerで

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

は:

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

+1に変更してください。本当にコードはより綺麗に見えます。 –

+1

このクリーンなソリューションをありがとう! ;) – Dmitri

+3

このコードは、生産環境で大きく機能します。ただし、開発環境でUsersController#oauth_failureコードを変更すると、変更内容は表示されません。 Procをベースとしたsoundarのコードは、開発時には優れており、開発時には期待どおりに機能します。 – mcmlxxxiii

0

引き上げの代わりに/auth/failureを使用するように設定ありますエラー。

私はOmniAuth 1.2.2を使用して、私はFailureEndpointをチェックするとき、私はコードが thisのようなものです見つけ

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が定義されています

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 
関連する問題