問題
最近、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 が https
を http
に置き換えていたため、s
のない http://example.com/auth/github/callback
がredirect_url
となり、Github の「Authorization callback URL」に登録してあった URL と食い違ってしまうのである。