Rails+OmniauthでFacebook OAuthをするときにサブドメインを利用する

RailsでOAuthを利用するためには、Omniauthを使うのが定番です。

Twitterでは、OAuthのcallback urlをリクエスト単位で指定できるため、色々楽なのですが、
Facebookでは、OAuthに使うアプリごとにcallback url(ドメイン)を決めておく必要があります。

問題点

開発環境、ステージング環境、本番環境などURLごとにFacebookアプリを作らなくてはならずめんどくさいのですが、MANGA REBORNのような複数サブドメインを利用したサイトでは、さらに問題が発生します。

MANGA REBORNでは、現在、言語によって以下のURLを使い分けています。

  • ja.mangareborn.jp
  • en.mangareborn.jp

この状態でFacebook OAuthを実行すると、

  • Facebookアプリに「mangareborn.jp」を指定 → 日本語・英語ともエラー
  • Facebookアプリに「www.mangareborn.jp」を指定 → 日本語・英語ともエラー
  • Facebookアプリに「en.mangareborn.jp」を指定 → 日本語でエラー
  • Facebookアプリに「ja.mangareborn.jp」を指定 → 英語でエラー

となってしまいます。

かといってアプリを言語ごとに分けると、ユーザが言語を切り替えると認証情報を維持できない、ちょっと不親切なサイトになってしまいます。

解決策

Facebookアプリに登録してあるドメインと、リクエスト時に要求するCallback URLのドメインを一致させればOKです。

Facebookアプリ側には「www.mangareborn.jp」を登録しておき、Railsでは初期化コードで以下のような処理を入れておきます。

# config/initializers/omniauth.rb
OmniAuth.config.full_host = "https://www.mangareborn.jp"

あとは、OAuthの直前にどの言語だったかをセッションにでも保存しておいて、www.mangareborn.jpではその言語にリダイレクトする処理を入れればOKです。

Ruby on RailsによるWEBシステム開発、Android/iPhoneアプリ開発、電子書籍配信のことならお任せください この記事を書いた人と働こう! Ruby on Rails の開発なら実績豊富なBPS

この記事の著者

baba

ゆとりプログラマー。 高校時代から趣味でプログラミングを初め、そのままコードを書き続けて現在に至る。慶應義塾大学環境情報学部(SFC)卒業。BPS設立初期に在学中から参加している最古参メンバーの一人。Ruby on Rails、PHP、Androidアプリ、Windows/Macアプリ、超縦書の開発などを気まぐれにやる。軽度の資格マニアで、情報処理技術者試験(15区分 + 情報処理安全確保支援士試験)、技術士(情報工学部門)、CITP、Ruby Programmer Goldなどを保有。

babaの書いた記事

週刊Railsウォッチ

インフラ

BigBinary記事より

ActiveSupport探訪シリーズ