ぱろっと・すたじお

技術メモなどをまったりと / my site : http://parrot-studio.com/

OmniAuthを正しくcallbackさせる

先日、「TwitterでログインできるBBS」を、
Apache+(nginx+passenger)という環境にリリースしたのですが、
その認証に利用したのが「OmniAuth」でございます


https://github.com/intridea/omniauth


WEB+DB PRESSのvol.64にも記事があります(´・ω・)っ

WEB+DB PRESS Vol.64

WEB+DB PRESS Vol.64


Twitter/Facebook/OpenID等々の認証が、
同一のインターフェースで可能という、すばらしいものなのですが、
それに関する記事は山ほどあるのでそちらを見てもらうとして・・・


開発環境ではあっさり動いたのですが、問題は本番環境です


OmniAuthからTwitterの認証を呼ぶまではいいのですが、
TwitterからCallbackされる際、
バックエンドのポートつきで呼び出されてしまうのですΣ(゚Д゚)ガーン


つまり、「example.com/hoge/auth/twitter/callback」を呼んでほしいのですが、
「example.com:8888/hoge/auth/twitter/callback」に戻ろうとしてしまい、
アクセスができないという問題が出ました


しかも、最初に作ったRails3.1版のプロトタイプでは問題なかったのが、
正式に作り替えたRails3.0版だとポートがついてきてしまうのです
たぶん、中で呼んでいるメソッドの実装が変わったのでしょうけども・・・


どちらにせよ、「バックエンドのURL」に戻るのではなく、
「フロントのURL」に戻ってほしいのですが、
このやり方がわからなくてかなり悩みました(´-ω-) *1


結果的にはこちらに答えが

# in config/initializers/omniauth.rb
OmniAuth.config.full_host = "http://example.com" # フロントのURL

Rails.application.config.middleware.use OmniAuth::Builder do
  # Twitter認証
  provider :twitter, YOUR_KEY, YOUR_SECRET
end


これでOmniAuthで使うURLを強制できます(`・ω・´) b
元の記事を読むと、Procを渡してその結果を使うこともできるようです
で、何も渡されないと自身のURLから生成する・・・と

*1:どの記事も「開発環境で動かすところ」までしか書いてなくて、本番でこの問題にどう対処したのか書いた記事が見つからなかったという・・・