at posts/single.html

Rack 環境で OmniAuth 1.0 を使う

一年前にOmniAuthを使ったときはバージョン0.3だったけど、いつの間にかバージョン1.0が出ていたので久しぶりに使ってみた。1.0になって以前のバージョンとは非互換がある。詳しくは公式サイトを参照。

各々の Strategy が別 gem に分離

本体をシンプルに保つためにも、これは良いことだと思う。たとえば Twitter 認証を使いたければ Gemfile にこう書く。

gem 'omniauth'
gem 'omniauth-twitter'

取得できるハッシュの形式が変わった

user_infouser になったり、ハッシュの形式が変わっている。

使ってみた

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

関連する日記