いますぐ使えるOpenID

第4回 Railsで作るOpenID対応アプリケーション実践(前編)

この記事を読むのに必要な時間:およそ 4 分

OpenID Authenticationプラグインのインストールと初期設定

OpenID Authenticationプラグインは,以下のコマンドでインストールできます。

./script/plugin install open_id_authentication

インストールしたプラグインは,vender/plugin/open_id_authenticationに展開されます。展開先のREADMEに使い方やサンプルが書いてあるので,一読しておくとよいでしょう。OpenID Authenticationプラグインをインストールすると,以下のrakeタスクが使用できるようになります。

$ rake open_id_authentication:db:create

このタスクを実行すると,ruby-openidライブラリが使用するデータを保存するためのデータベースを生成します。生成されるテーブルは表2の通りです。

表2

テーブル名説明
open_id_authentication_associationsOPと共有する共通鍵を保存する
open_id_authentication_nonces認証ごとに使用するナンス(nonce)を保存する

OpenIDは,OP(OpenID Provider)とRP(Relying Party)の間で共通鍵を共有します。利用者がログインするたびに共通鍵を共有すると大変なので,共有した共通鍵はデータベースに保存しておき,二回目からは保存した鍵を使用します。また,ナンス(nonce)とは,利用者がOpenIDでログインしようとするたびに,OPからのOpenIDレスポンスに付与されるランダムな文字列です。同じナンスを一度しか受け入れないことで,利用者や悪意ある第三者がOpenIDレスポンスを再利用すること(リプレイ攻撃)を防ぎます。

モデル・コントローラの一覧

サンプルアプリケーションで作成したモデルの一覧を以下の表3に示します。特にOpenID認証で特徴的なのは,ユーザを管理するUserモデルの属性にパスワードがなく,代わりにOpenIDのアカウント名(Claimed Identifier)を保存するためのidentity_url属性が存在することです。

表3 モデルの一覧

モデル名属性値役割
Userid, nickname, identity_urlユーザ情報を管理する
Relationuser_id, follow_idユーザ同士のお気に入り関係を管理する
Messageuser_id, bodyユーザが投稿したつぶやきを管理する

次に,作成したコントローラの一覧を以下の表4に示します。コントローラの構成は,パスワード認証の場合とそれほど違いはありません。これは,前ページで解説したように,認証方式の違いはユーザ管理機能の一部に過ぎないためです。特にOpenID認証で特徴的なのは,ログイン処理を担当するSessionsControllerのcreateアクションです。

表4 コントローラの一覧

コントローラ名アクション(メソッド)役割
ApplicationControllerlogin_requiredユーザが認証済みかどうかを確認する
UsersControllernew, create, homeユーザ登録およびユーザのホーム画面
SessionsControllernew, create, destroyユーザのログイン,ログアウトを管理する
MessagesControllertimeline, index, show, create, destroyユーザのつぶやきを管理する

文字だけでは流れがつかみづらいので,画面遷移図を元にして認証の流れをご説明します。パスワード認証の場合と異なるのは,ユーザ登録の時も事前にOpenIDで利用者を認証することです。

図2 サンプルアプリケーションの画面遷移図

図2 サンプルアプリケーションの画面遷移図

  • (1)利用者がOpenIDアカウントを入力しログインボタンをクリックします。
  • (2)OpenIDアカウントを元にOPを発見し,OpenIDリクエストを生成して利用者をOPへ誘導します。
  • (3)OPは利用者を認証し,OpenIDレスポンスを生成して利用者をRPへ誘導します。
  • (4-A)認証成功し,かつユーザがすでに登録されていれば,ログイン済みと判定して利用者をサービス画面へ誘導します。
  • (4-B)認証成功し,かつユーザが未登録であれば,利用者をユーザ登録画面へ誘導します。
  • (4-C)認証に失敗すると,エラーメッセージをログイン画面に表示します。
  • (5),(6)ニックネームを入力しユーザ情報を登録します。

(1)から(4)までがログイン処理で,Sessionsコントローラが担当します。⁠5)から(6)までがユーザ登録処理で,Usersコントローラが担当します。では,それぞれの処理について見ていきましょう。

著者プロフィール

松岡浩平(まつおかこうへい)

NTTコムウェア株式会社にて,オープンソースを活用した認証システムの開発を担当しています。ここ2年は,情報セキュリティ大学院大学に通学しながら,OpenIDを使った認証システムについて研究していました。