Sinatra + OmniAuth で Twitter の OAuth を試してみた

Sinatra アプリの認証に Warden を使おうとしてたけど、「ユーザー名とパスワードを自前で保存したくない」と思い直して、OAuth や OpenID を検討し始めました。TwitterFacebook や GitHub など、いろんな OAuth に対応したいから、使うライブラリは OmniAuth かな。

Sinatra + OmniAuth で、Twitter の OAuth を使って認証するサンプルを書いてみました。

# coding: utf-8
require "sinatra"
require "omniauth"
require "omniauth-twitter" # Twitter の OAuth を使うなら必須

# Sinatra のセッションを有効にする
enable :sessions

# OmniAuth の設定
use OmniAuth::Builder do
  # Twitter の OAuth を使う
  provider :twitter, "Consumer key", "Consumer secret"
end

get "/" do
  erb :index
end

# Twitter の認証が成功したら呼び出される
get "/auth/:provider/callback" do
  # 認証情報は request.env に格納されている
  @auth = request.env["omniauth.auth"]
  erb :home
end

__END__
@@layout
<!DOCTYPE html>
<html>
    <head>
        <title>Sinatra-OmniAuth</title>
    </head>
    <body>
        <%= yield %>
    </body>
</html>

@@index
<a href="/auth/twitter">Twitter でログイン</a>

@@home
<h1>Wellcome</h1>
<pre>
    <%= @auth %>
</pre>

たったこれだけのコードで実装できてしまった…。以前、Python + AppEngine + Kay Framework で Twitter の OAuth に挑戦したときは、結構コード書いたのにな。