Sinatra+Haml+Omniauthをスカッと体感する

ちょっと今までやってないSinatraHamlを試してみようと思い立ち、何気なく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を終えてある前提です。

今回は

  • app.rb
  • config.ru
  • views/index.haml
  • views/index2.haml

という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プロバイダでの認証サンプルが作れてしまいます。まぁ、なんてことでしょう。

実感したこと

これほど簡単に認証連携が作れるのであれば、わざわざ認証を自前で作る方が間違っているのでは?と思えます。(もちろん、公衆アプリを作る場合です。企業内アプリで公衆アプリのOAuth認証を使うことはあっても相当まれなケースだと思います。)
とはいうものの、企業内でもシングルサインオンのために何らかの認証サーバを作っているケースもありますので、このサンプルが参考になるケースもあるかと思います。

それにしても・・・なんと短いソースなんでしょ。それだけ、ライブラリが整備されていて、他システムとの連携が容易になっているということですね。いやはや。