原文を読む]でOmniAuthについて説明しました。OmniAuthは、Twitterなどのサードパーティによる認証サービスを自分のRailsアプリケーションに統合することを可能にします。これらのエピソードで提示したシナリオでは、アプリケーションにすでにユーザ名とパスワードを管理するしくみ(この場合はDevice)が存在しているところにOmniAuthを統合するという、どちらかというと複雑なものでした。ユーザごとに複数の認証方法を提供していました。このような特別な要求がないのであれば、OmniAuthによる認証はずっと単純になるということをこのエピソードで紹介します。今回扱うアプリケーションも、以前使用したシンプルなブログシステムです。現状では認証のしくみを持っていないので、OmniAuthだけを使ってTwitterによる認証機能を付加します。Authlogic、Deviseやその他の認証の手法を使わないので、OmniAuthがいかにシンプルかがわかるでしょう。3で作成するので、Gemfileにgemを追記します。"omniauth"忘れずにbundlerを実行し、必要なgemがすべてインストールされていることを確認しましょう。次に設定ファイルomniauth.rbを作成してOmniAuthをロードします。このファイル内に、OmniAuthをロードしTwitterを使用することを指定します。'CONSUMER_SECRET'endアプリケーションにOmniAuthをミドルウェアとして付加することに注意してください。OmniAuthは、Rackミドルウェアにとても似ていて、アプリケーションの他の部分から切り離されているという点で非常に優れています。これによって、アプリケーションに自由な形で認証機能を実装することが可能です。今回、認証情報の提供元はTwitterのみとします。ここでCONSUMER_KEYとCONSUMER_SECRETの値を実際の値に置き換えます。これらの値は、Twitterの開発者向けサイトでユーザ情報を入力しアプリケーションを登録したら入手できます。登録が終わったら、認証機能の追加作業を始めましょう。レイアウトファイル内のプレースホルダーのテキストをログインリンクと置き換えます。URLにリンクされます。今回は/auth/twitterになります。%></div>これでログイン用のリンクができました。クリックするとTwitterのサイトにリダイレクトされ、(作成中の)アプリケーションへのアクセスを許可するかどうか聞かれます。「許可する(allow)」をクリックすると、作成中のアプリケーションにリダイレクトされルーティングエラーが表示されます。このエラーが表示される理由は、ブラウザのリダイレクト先がOmniAuthの認証が成功したときに起動されるコールバックURLになっているからです。これに合わせて、routesファイル内のルートを設定します。認証処理のためにSessionsControllerを作成して、その中のcreateアクションにリダイレクトさせます。:articlesendURLのtwitterの部分を、:providerという引数に置き換えました。これは、Twitter以外の認証元を利用した場合にもルートが対応できるようにするためです。次にSessionsコントローラを新規に作成します。sessions認証後にアプリケーションに戻ると、認証に関する情報をハッシュ形式で持つomniauth.authという環境変数が利用できます。ここでは一時的に、例外を発生させてこの情報を表示させます。endendログインすると、アプリケーションにリダイレクトしたときにTwitterの認証情報が表示されます。このハッシュ内の情報は、既存のユーザとしてログインするか、あるいは一致するアカウントがない場合に新規ユーザを作成するときに利用することができます。アプリケーションにUserモデルがないので作成しましょう。name:stringこのモデルにはproviderとuidという属性があり、ユーザがログインしたときに、これらを使ってユーザを特定します。nameフィールドを追加します。次にデータベースをmigrateします。db:migrateではここでSessionsControllerに戻って、OmniAuthの情報を使って既存ユーザを呼び出すか新規ユーザを作成します。endendcreateメソッド内で、OmniAuthハッシュ内のproviderとuidの値からユーザの検索を試みます。何も一致しなかったら、User内の、今から作るcreate_with_omniauthというクラスメソッドを使って新規ユーザを作成します。endend上のメソッドではcreate!をブロックと一緒に呼び出します。これによって新規ユーザの情報がデータベースに保存される前に修正することができるようになります。このメソッドを書いたら、コントローラに戻ってcreateメソッドを完成させます。セッションにユーザidを保存し、スタートページにリダイレクトしてflashメッセージを表示します。Twitter)」のリンクをクリックすると、(Twitterアカウントにすでにログインしていると判断して)自動的にログインします。このページには問題があります。in)」の表示が残っています。ここは代わりに、ユーザ名とログアウトのためのリンクが表示されているべきでしょう。現在ログイン中のユーザの情報にアクセスする必要があるので、ApplicationControllerクラスにcurrent_userメソッドを追加します。このメソッドは、セッションのuser_idからログインユーザの情報を得て、結果をインスタンス変数に保持します。この情報に、コントローラからだけでなくビューからもアクセスできるよう、ヘルパーメソッドとして作成します。endend次にレイアウトファイルを修正し、ユーザがログインしていないときだけログインのリンクが表示されるようにします。ログイン後は代わりにユーザ名を表示します。%></div>ページをリロードすると、ページ上部に現在ログインしているユーザ名で「ようこそ、Eifion!」と表示されています。ログアウト用のリンクもあれば便利なので、ユーザ名の隣に追加します。これは、まだ作っていないsignout_pathへのリンクになります。%></div>signout_pathをSessionControllerのdestroyアクションに対応づけます。:signoutを追加することで、上のsignout_pathを参照できるようになります。destroyアクションを書きます。out!"endここでページをリロードすると、ログアウト用のリンクが表示され、クリックするとログアウトします。外部認証を追加するOmniAuthを使っていれば、外部認証を追加するのも簡単です。Facebookで認証させたければ、ページレイアウトにもう一つリンクを追加するだけです。%></div>正しい証明情報を設定ファイルomniauth.rbに追加すれば、アプリケーションにFacebookを介してログインできるようになります。OpenId、LinkedIn、その他の認証プロバイダを追加することができます。アプケーションに従来のユーザ名やパスワードによる認証が必要なく、アカウントごとに異なった種類の認証をしなくてもいいのであれば、今回の方法は効率がよく、どのようなアプリケーションにも簡単に付加することができます。