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です。