ログインサービス用にRails Omniauth を使用したアプリケーションを構築しています。Googleを認証するために OmniAuth Google OAuth2戦略 を使用しています。
ユーザーが「アクセスを許可」ボタンをクリックすると、すべてが正常に動作しますが、「いいえ」ボタンをクリックすると、以下のエラーが発生します。
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
しかし、運はありません。
何か案が?
ありがとうございました :)
これは、認証がミドルウェアで行われるため、コントローラーが関与しないために発生します。これは 例外が発生した場合 であり、呼び出されたコードは this です。
この種のコードでOmniauth初期化子にコールバックを定義することで、この種のエラーを処理できると思います
Omniauth.config do |config|
config.on_failure do
# your handling code invoked in the context of a rack app
end
end
それ以外の場合、この動作を導入する3か月前の コミット があります。
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
にリダイレクトされるため、そのパスのルートを定義してアプリで処理できる必要があります。これは発生しないことに注意してください 開発モード なので、他の環境で試す必要があります。これが本番環境で発生しない場合は、omniauth gemをバージョン1.1.0にアップグレードしてください。
さらにきれいな方法でomniauth初期化子のon_failureプロシージャを設定できます。
OmniAuth.config.on_failure = UsersController.action(:oauth_failure)
私はこの問題をファビオの最初の提案で解決しました。
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
使用する設定があります/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_environments
が定義されています ここ :
def self.defaults
@defaults ||= {
# other configurations
:failure_raise_out_environments => ['development']
}
end
ソリューションが簡単になるように環境を構成できます。 Railsを使用するため、初期化ファイルに以下のコードを記述します。
OmniAuth.configure do |config|
# Always use /auth/failure in any environment
config.failure_raise_out_environments = []
end