42

ログインサービス用にOmniauthを使用して Rails アプリケーションを構築しています。Google を認証するには、OmniAuth Google OAuth2 Strategyを使用しています。

ユーザーが「アクセスを許可」ボタンをクリックすると、すべて正常に動作しますが、ユーザーが「いいえ」ボタンをクリックすると、以下のエラーが発生します。

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

しかし、運がありません。何か案が?

4

4 に答える 4

66

omn​​iauth 初期化子で on_failure proc をさらにきれいな方法で設定できます。

OmniAuth.config.on_failure = UsersController.action(:oauth_failure)
于 2012-06-29T05:35:37.760 に答える
39

これは、認証がミドルウェアで行われるため、コントローラーが関与しないために発生します。ここで例外が発生し、呼び出されたコードはこれです

この種のコードで 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 にアップグレードしてみてください。

于 2012-05-24T12:43:59.150 に答える
18

私は Fabio の最初の提案でこの問題を解決しました。

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
于 2012-05-24T18:36:07.117 に答える
1

/auth/failureエラーを発生させる代わりに使用する構成があります。

私は OmniAuth 1.2.2 を使用しています。FailureEndpoint を確認すると、コードは次のようになっていることがわかりまし

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
于 2015-06-15T07:43:12.547 に答える