web-dev-qa-db-ja.com

OmniAuth :: Strategies :: OAuth2 :: CallbackErrorを救う方法?

ログインサービス用に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

しかし、運はありません。

何か案が?

ありがとうございました :)

40

これは、認証がミドルウェアで行われるため、コントローラーが関与しないために発生します。これは 例外が発生した場合 であり、呼び出されたコードは 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にアップグレードしてください。

36
Fabio

さらにきれいな方法でomniauth初期化子のon_failureプロシージャを設定できます。

OmniAuth.config.on_failure = UsersController.action(:oauth_failure)
64
Peter P.

私はこの問題をファビオの最初の提案で解決しました。

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
17

使用する設定があります/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
0
darkbaby123