OmniAuth: ロードバランサ配下での redirect_uri_mismatch 問題

問題

最近、OmniAuthを使ってGithub経由でのユーザー認証機能を既存のRailsアプリに組み込んだ。

その際、開発環境ではすんなり動いたのだが、本番環境にデプロイすると redirect_uri_mismatch エラーが出てしまう。

解決法

config/initializers/omniauth.rb に次のような記述を追加する。

if Rails.env.production?
  OmniAuth.config.full_host = "https://example.com"
end

原因

本番環境のRailsアプリがロードバランサ(Nginx)配下で動いていたためであった。OmniAuth は request.url が返す文字列を使って、redirect_url を作る。例えば、https://example.com/shopping_cart なら https://example.com/auth/github/callback になる。

しかし、私の環境では Nginx が httpshttp に置き換えていたため、s のない http://example.com/auth/github/callbackredirect_url となり、Github の「Authorization callback URL」に登録してあった URL と食い違ってしまうのである。

参考資料