Sinatra+Haml+Omniauthをスカッと体感する
ちょっと今までやってないSinatraとHamlを試してみようと思い立ち、何気なくOmniauthを使ってTwitterで認証する部分のみを作ってみました。怖いくらいあっさりできたのでレポートしてみます。
下準備1
Ruby1.9系のインストールをしておいて下さい。
Ubuntu11.04の場合を書いておくと
sudo apt-get install make gcc wget libssl-dev zlib1g-dev libreadline-dev libxml2 libxml2-dev libxslt1-dev
を行い
http://www.ruby-lang.org/ja/downloads/
からruby 1.9.2-p180のtar.gzのリンクをコピーしてwgetで取得します。configureとmakeとmake installでインストールして下さい。
その後
sudo gem update --system sudo gem update
を行ってアップデートしておきます。
最後に
sudo gem install sinatra omniauth haml shotgun
です。もしRuby1.9.2の実行環境がある場合は、ここだけ実施して下さい。
下準備2
今回はTwitterで認証をするので、TwitterでのOAuth認証に必要となる手続きを済ませておきます。
具体的にはアプリの登録申請を行い、ConsumerKeyとConsumerSecretを取得します。
https://dev.twitter.com/apps/new
上記URLで申請しますが、細かい手順は各自調べてみて下さい。
ファイルの作成
それでは本番です。下準備1と2を終えてある前提です。
今回は
という4ファイル(うち2ファイルはviewsディレクトリの下)を作ります。
まずapp.rbはこんな感じ。
なお、ソース中の「CONSUMER_KEY」と「CONSUMER_SECRET」の部分に、下準備2で取得したものを書き込んで下さい。
次にconfig.ruです。
次からの2つのファイルは「views」というディレクトリを作り、その下に作ります。
index.haml
index2.haml
以上です。
サーバ起動とテスト
さて、ファイルの準備が終わったらサーバの起動です。
$ shotgun -o 0.0.0.0 -p 3000
ブラウザで
http://サーバIP:3000/
にアクセスすると「Sign in Twitter」と表示されますのでクリックして下さい。
そうするとTwitterの認証に飛んでいき、承認すると「Finish!」と表示されTwitterから取得された情報が表示されると思います。
ちょっとだけ解説
いくつかポイントを解説してみます。
もちろん何と言っても最大のポイントはapp.rbです。
Sinatraではuseを使うことで、別のRackアプリケーションを組み込むことができます。今回はOmniauthさんがuseで幾つかのURLに予約を入れてくれます。providerでtwitterを指定していますので、/auth/twitterが予約されていることになります。
「Sign in Twitter」をクリックすると/auth/twitterに飛び、OmniauthがTwitterの承認先へのリダイレクトを生成しブラウザへ返します。そしてTwitterのログイン画面にアクセスされるという流れです。(なお、もしブラウザでTwitterのログインがすでに行われているとログイン処理が割愛されます。)
ログインを行うと今度はアプリケーションの承認画面になります。そして承認を行うと、/auth/twitter/callbackに戻ってきます。
この時、Omniauthではリクエストの環境変数「omniauth.auth」に承認情報を入れておいてくれるので、app.rbではそれを@authに入れておきindex2.hamlの中でpreタグの中に展開しています。
ということで、この例を使えばOmniauthが対応しているあらゆるOAuthプロバイダでの認証サンプルが作れてしまいます。まぁ、なんてことでしょう。