omniauth 連携キャンセルした時にリダイレクトさせる

1 min読了の目安(約1000字TECH技術記事

omniauth を使用して、サードパーティログインを実装すると、各サードパーティの OAuth 画面(連携認証画面)でキャンセルしたときに、リダイレクト先を設定していないとエラーが発生してしまいます。なので、リダイレクトを設定しておく必要があります。
今回は Facebook を例に紹介していきます。

環境

  • Ruby 2.3.1
  • Ruby on Rails 4.2.7.1
  • omniauth 1.9.1
  • omniauth-facebook 7.0.0

エラー内容

リダイレクト先を設定しないとエラーが発生します。

  1. 「Facebook でログイン」ボタンを押下(Facebook と連携させるリンクボタン)
  2. OAuth 画面(連携認証画面)で「後で」もしくは「キャンセル」ボタンを押下
  3. エラーが発生する
  • エラー内容
    omniauth: (facebook) Authentication failure! invalid_credentials: OmniAuth::Strategies::OAuth2::CallbackError, csrf_detected | CSRF detected

解決策

[config/initializers/omniauth.rb]にリダイレクト先を追記
下記では、リダイレクト先にトップページを指定している。

Rails.application.config.middleware.use OmniAuth::Builder do
  ...
  on_failure do |env|
    Web::TopController.action(:index).call(env)
  end
end

これにより、先ほどの Facebook の OAuth 画面(連携認証画面)で「後で」もしくは「キャンセル」ボタンを押下したときに、トップページへ遷移することができます。
この設定は、omniauth-facebook だけではなく、omniauth 共有の設定であるため、他のサードパーティ(Twitter, Yahoo など)でも認証をキャンセルしたときに、同様なリダイレクトが実行されます。