17

Rails 3アプリでOmniAuthを使用してログインプロセスを開始したときに、プロバイダーのページでキャンセルすると、次のようなURLに返送されます。

http://example.com/auth/twitter/callback?denied=aUho....

そして、私のアプリケーションは500をスローします。これは、コントローラーのアクションに触れることなく、OAuth :: Unauthorized:401Unauthorizedであることがわかります。

スタックトレースは、コンピューターで再現したときのものです。

oauth (0.4.6) lib/oauth/consumer.rb:216:in `token_request'
oauth (0.4.6) lib/oauth/consumer.rb:136:in `get_request_token'
omniauth-oauth (1.0.1) lib/omniauth/strategies/oauth.rb:29:in `request_phase'
omniauth-twitter (0.0.11) lib/omniauth/strategies/twitter.rb:50:in `request_phase'
omniauth (1.1.0) lib/omniauth/strategy.rb:207:in `request_call'
omniauth (1.1.0) lib/omniauth/strategy.rb:174:in `call!'
omniauth (1.1.0) lib/omniauth/strategy.rb:157:in `call'
omniauth (1.1.0) lib/omniauth/strategy.rb:177:in `call!'
omniauth (1.1.0) lib/omniauth/strategy.rb:157:in `call'
omniauth (1.1.0) lib/omniauth/builder.rb:48:in `call'
sass (3.1.19) lib/sass/plugin/rack.rb:54:in `call'
warden (1.1.1) lib/warden/manager.rb:35:in `block in call'
warden (1.1.1) lib/warden/manager.rb:34:in `catch'
warden (1.1.1) lib/warden/manager.rb:34:in `call'
actionpack (3.2.6) lib/action_dispatch/middleware/best_standards_support.rb:17:in `call'
rack (1.4.1) lib/rack/etag.rb:23:in `call'
rack (1.4.1) lib/rack/conditionalget.rb:25:in `call'
actionpack (3.2.6) lib/action_dispatch/middleware/head.rb:14:in `call'
actionpack (3.2.6) lib/action_dispatch/middleware/params_parser.rb:21:in `call'
actionpack (3.2.6) lib/action_dispatch/middleware/flash.rb:242:in `call'
rack (1.4.1) lib/rack/session/abstract/id.rb:205:in `context'
rack (1.4.1) lib/rack/session/abstract/id.rb:200:in `call'
actionpack (3.2.6) lib/action_dispatch/middleware/cookies.rb:338:in `call'
activerecord (3.2.6) lib/active_record/query_cache.rb:64:in `call'
activerecord (3.2.6) lib/active_record/connection_adapters/abstract/connection_pool.rb:473:in `call'
actionpack (3.2.6) lib/action_dispatch/middleware/callbacks.rb:28:in `block in call'
activesupport (3.2.6) lib/active_support/callbacks.rb:405:in `_run__60653626266012267__call__4496837804684830799__callbacks'
activesupport (3.2.6) lib/active_support/callbacks.rb:405:in `__run_callback'
activesupport (3.2.6) lib/active_support/callbacks.rb:385:in `_run_call_callbacks'
activesupport (3.2.6) lib/active_support/callbacks.rb:81:in `run_callbacks'
actionpack (3.2.6) lib/action_dispatch/middleware/callbacks.rb:27:in `call'
actionpack (3.2.6) lib/action_dispatch/middleware/reloader.rb:65:in `call'
actionpack (3.2.6) lib/action_dispatch/middleware/remote_ip.rb:31:in `call'
actionpack (3.2.6) lib/action_dispatch/middleware/debug_exceptions.rb:16:in `call'
actionpack (3.2.6) lib/action_dispatch/middleware/show_exceptions.rb:56:in `call'
railties (3.2.6) lib/rails/rack/logger.rb:26:in `call_app'
railties (3.2.6) lib/rails/rack/logger.rb:16:in `call'
quiet_assets (1.0.1) lib/quiet_assets.rb:20:in `call_with_quiet_assets'
actionpack (3.2.6) lib/action_dispatch/middleware/request_id.rb:22:in `call'
rack (1.4.1) lib/rack/methodoverride.rb:21:in `call'
rack (1.4.1) lib/rack/runtime.rb:17:in `call'
activesupport (3.2.6) lib/active_support/cache/strategy/local_cache.rb:72:in `call'
rack (1.4.1) lib/rack/lock.rb:15:in `call'
actionpack (3.2.6) lib/action_dispatch/middleware/static.rb:62:in `call'
airbrake (3.1.1) lib/airbrake/rack.rb:30:in `call'
airbrake (3.1.1) lib/airbrake/user_informer.rb:12:in `call'
railties (3.2.6) lib/rails/engine.rb:479:in `call'
railties (3.2.6) lib/rails/application.rb:220:in `call'
rack (1.4.1) lib/rack/content_length.rb:14:in `call'
railties (3.2.6) lib/rails/rack/log_tailer.rb:17:in `call'
thin (1.3.1) lib/thin/connection.rb:80:in `block in pre_process'
thin (1.3.1) lib/thin/connection.rb:78:in `catch'
thin (1.3.1) lib/thin/connection.rb:78:in `pre_process'
thin (1.3.1) lib/thin/connection.rb:53:in `process'
thin (1.3.1) lib/thin/connection.rb:38:in `receive_data'
eventmachine (0.12.10) lib/eventmachine.rb:256:in `run_machine'
eventmachine (0.12.10) lib/eventmachine.rb:256:in `run'
thin (1.3.1) lib/thin/backends/base.rb:61:in `start'
thin (1.3.1) lib/thin/server.rb:159:in `start'
rack (1.4.1) lib/rack/handler/thin.rb:13:in `run'
rack (1.4.1) lib/rack/server.rb:265:in `start'
railties (3.2.6) lib/rails/commands/server.rb:70:in `start'
railties (3.2.6) lib/rails/commands.rb:55:in `block in <top (required)>'
railties (3.2.6) lib/rails/commands.rb:50:in `tap'
railties (3.2.6) lib/rails/commands.rb:50:in `<top (required)>'
script/rails:6:in `require'
script/rails:6:in `<top (required)>'
-e:1:in `load'
-e:1:in `<main>'

(Twitterのページで[キャンセル]をクリックせずに)ログインを続行すると、すべてが期待どおりに正しく機能します。Facebookでも同じように、問題なくログインできますが、Facebookのページで「キャンセル」を押すと、リダイレクトされて500をスローします。

これをより適切に処理する方法はありますか?素敵なページを見せたいです。

4

4 に答える 4

24

障害が発生すると、ほとんどの場合、障害の種類に応じて、OmniAuthはOmniAuth.config.on_failureデフォルトでに設定されているを呼び出しますOmniAuth::FailureEndpoint。デフォルトでは、開発モードで例外を発生させ、それ以外の場合はリダイレクトすることになっています。

def call
  raise_out! if ENV['RACK_ENV'].to_s == 'development'
  redirect_to_failure
end

ドキュメントによると、デフォルトのエンドポイントはです/auth/failure

それが期待どおりに機能しない場合は、これを初期化子に追加することで、開発モードであっても、リダイレクトを常に強制的に実行できます。

class SafeFailureEndpoint < OmniAuth::FailureEndpoint
  def call
    redirect_to_failure
  end
end

OmniAuth.config.on_failure = SafeFailureEndpoint

https://github.com/intridea/omniauth/issues/616からのより簡潔なソリューション

# Added to config/initializers/omniauth.rb
OmniAuth.config.on_failure = Proc.new { |env|
  OmniAuth::FailureEndpoint.new(env).redirect_to_failure
}
于 2012-06-14T07:00:54.123 に答える
6

私は同じ問題を抱えていました、(Facebookのキャンセルをクリックしました)

追加後

# Added to config/initializers/omniauth.rb
OmniAuth.config.on_failure = Proc.new { |env|
  OmniAuth::FailureEndpoint.new(env).redirect_to_failure
}

として実装された認証コールバックルート

config/routes.rbにあります

match '/auth/failure' => 'sessions#failure' 

セッションコントローラーは次のようになります

class SessionsController < ApplicationController
  def failure
    redirect_to #route that you want redirect
  end
end
于 2013-10-08T07:39:41.133 に答える
3

同じ問題が発生し、Pramodのソリューションでは「不明なアクション」エラーが発生していましたが、コールバックルートをに変更した後に機能しました

config / routers.rb

devise_scope :user do
  get '/users/auth/failure' => 'sessions#failure'
end   

Rails 3.2.14
Devise 3.1.1
Omniauth 1.1.4

于 2013-11-11T02:04:42.517 に答える
0

omn​​iauth_facebookやUsers::OmniauthCallbacksControllerのようなものを使用している場合は、次を使用します。

config / routers.rb

devise_scope :user do
  get '/omniauth/failure' => 'users/omniauth_callbacks#failure'
end

app / controllers / users / omniauth_callbacks_controller.rb

class Users::OmniauthCallbacksController < Devise::OmniauthCallbacksController
  def facebook
    ...
  end
  def failure
    redirect_to root_path
  end
end

FBポップアップを使用している場合

app / controllers / users / omniauth_callbacks_controller.rb

class Users::OmniauthCallbacksController < Devise::OmniauthCallbacksController
  def facebook
    ...
  end
  def failure
    if request.env['HTTP_REFERER'] == "https://www.facebook.com/"
      render 'failure', :layout => false
    else
      redirect_to root_path
    end
  end
end

app / views / users / omniauth_callbacks / failure.html.haml

:javascript
  window.close();
于 2016-05-26T20:52:38.447 に答える