Tech Racho エンジニアの「?」を「!」に。
  • 開発

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


CONTACT

TechRachoでは、パートナーシップをご検討いただける方からの
ご連絡をお待ちしております。ぜひお気軽にご意見・ご相談ください。