Rack 環境で OmniAuth 1.0 を使う
一年前にOmniAuthを使ったときはバージョン0.3だったけど、いつの間にかバージョン1.0が出ていたので久しぶりに使ってみた。1.0になって以前のバージョンとは非互換がある。詳しくは公式サイトを参照。
各々の Strategy が別 gem に分離
本体をシンプルに保つためにも、これは良いことだと思う。たとえば Twitter 認証を使いたければ Gemfile にこう書く。
gem 'omniauth'
gem 'omniauth-twitter'
取得できるハッシュの形式が変わった
user_info
が user
になったり、ハッシュの形式が変わっている。
使ってみた
README.mdを参考にしつつ、素のRackで書いてみた。 config.ru はこれ。
require './hello.rb'
require 'rack/static'
require 'omniauth'
require 'omniauth-twitter'
use Rack::Session::Cookie
use OmniAuth::Builder do
provider :twitter, ENV['TWITTER_KEY'], ENV['TWITTER_SECRET]'
end
# map "/" do
# run HelloApp.new
# end
map "/public" do
run Rack::File.new("public/")
end
run HelloApp.new
わかったこと。
- / にアクセスすると HelloApp が呼ばれる(認証なし)
- /public にアクセスすると Rack::File が呼ばれる(認証なし)
- /auth/twitter にアクセスすると Twitter で認証し、 /auth/twitter/callback が呼ばれる
このように OmniAuth は認証してくれるけど、アクセス制御はやってくれない。特定のディレクトリにアクセス制御をするためには、自分で /auth/twitter へのリダイレクトを書く必要がある。
それから、 map "/"
を有効にすると /auth/twitter
で OmniAuth が呼ばれなくなったので、こちらももうちょっと工夫が必要かな。
参考
追記
それから、
map "/"
を有効にすると/auth/twitter
で OmniAuth が呼ばれなくなったので、こちらももうちょっと工夫が必要かな。
解決。単に use と map の位置関係の問題だった。
map を先に書いて use を後に書くと、 use で指定したミドルウェアが反映されない。
map "/" do
run HelloApp.new
end
use Rack::Session::Cookie
use OmniAuth::Builder do
provider :twitter, ENV['TWITTER_KEY'], ENV['TWITTER_SECRET]'
end
use を先に書けば、ちゃんと /auth/:provider
へのリクエストを OmniAuth が処理してくれた。
use Rack::Session::Cookie
use OmniAuth::Builder do
provider :twitter, ENV['TWITTER_KEY'], ENV['TWITTER_SECRET]'
end
map "/" do
run HelloApp.new
end