はじめに
今回はいよいよ、
さて、
- ユーザ登録
- サービスを利用するために必要な情報
(IDやメールアドレスなど) を利用者に入力してもらい、 データベースへ登録する。 - ログイン
(認証) - 利用者が入力した認証情報
(パスワードなど) を元に利用者を認証し、 ログインの可否を判定する。ログインに成功した利用者には、 認証済みであることを識別するための識別子 (セッションCookie) を発行する。 - セッション管理
- 利用者から送信されるセッションCookieを元に、
その利用者が認証済みであることを確認する。一定時間アクセスがない利用者はセッションを無効にする。 - アクセス制御
(認可) - 利用者がアクセス先のリソースへの権限を持っているかどうかを判定する。
- ログアウト
- セッションを破棄し利用者の認証状態を解除する。
- アカウント管理
- 利用者が登録した情報を変更できるようにする。パスワードの変更やパスワード紛失時の再発行も担当する。

いかがでしょうか。想像したよりも認証に必要となる機能は多岐に渡ります。OpenIDを使うことで、
なお、
RailsのOpenIDプラグイン(OpenID Authentication)
RailsにはOpenIDを用いてユーザを認証するためのOpenID Authenticationというプラグインが存在します。このプラグインはこの連載で紹介したruby-openidライブラリのラッパーです。OpenID Authenticationプラグインを使うことで、
Railsにはユーザ認証のためのプラグインがいくつか用意されています。Rails 1.
Restful Authentication | OpenID Authentication | |
---|---|---|
ユーザ登録 | ○ | × |
ログイン | ○(パスワード) | ○(OpenID) |
セッション管理 | ○ | × |
アクセス制御 | △ | × |
ログアウト | ○ | × |
アカウント管理 | × | × |
とはいえ、
OpenID Authenticationプラグインのインストールと初期設定
OpenID Authenticationプラグインは、
./script/plugin install open_id_authentication
インストールしたプラグインは、
$ rake open_id_authentication:db:create
このタスクを実行すると、
テーブル名 | 説明 |
---|---|
open_ | OPと共有する共通鍵を保存する |
open_ | 認証ごとに使用するナンス |
OpenIDは、
モデル・コントローラの一覧
サンプルアプリケーションで作成したモデルの一覧を以下の表3に示します。特にOpenID認証で特徴的なのは、
モデル名 | 属性値 | 役割 |
---|---|---|
User | id, nickname, identity_ | ユーザ情報を管理する |
Relation | user_ | ユーザ同士のお気に入り関係を管理する |
Message | user_ | ユーザが投稿したつぶやきを管理する |
次に、
コントローラ名 | アクション | 役割 |
---|---|---|
ApplicationController | login_ | ユーザが認証済みかどうかを確認する |
UsersController | new, create, home | ユーザ登録およびユーザのホーム画面 |
SessionsController | new, create, destroy | ユーザのログイン、 |
MessagesController | timeline, index, show, create, destroy | ユーザのつぶやきを管理する |
文字だけでは流れがつかみづらいので、

(1) 利用者がOpenIDアカウントを入力しログインボタンをクリックします。(2) OpenIDアカウントを元にOPを発見し、OpenIDリクエストを生成して利用者をOPへ誘導します。 (3) OPは利用者を認証し、OpenIDレスポンスを生成して利用者をRPへ誘導します。 (4-A) 認証成功し、かつユーザがすでに登録されていれば、 ログイン済みと判定して利用者をサービス画面へ誘導します。 (4-B) 認証成功し、かつユーザが未登録であれば、 利用者をユーザ登録画面へ誘導します。 (4-C) 認証に失敗すると、エラーメッセージをログイン画面に表示します。 (5) ニックネームを入力しユーザ情報を登録します。, (6)
(1)
OpenID Authenticationプラグインによるユーザ認証
ログイン処理
OpenID Authenticationプラグインを使ったログインの流れを見ていきます。まずはログイン画面からです。ここはOpenIDアカウント
<% form_tag(session_url) do %>
<label for="openid_url">OpenIDアカウント名を入力してください:</label>
<%= text_field_tag "openid_url" %>
<%= submit_tag 'Sign in', :disable_with => "Signing in…" %>
<% end %>
OpenIDの仕様では、
def create
# OpenID でユーザを認証する (begin, completeの両方に対応)
authenticate_with_open_id do |result, identity_url|
if result.successful?
if @current_user = User.find_by_identity_url(identity_url)
# 認証成功でユーザが登録済みの場合はログイン成功 (A)
successful_login
else
# 認証成功でユーザが未登録の場合はユーザ登録画面へ遷移 (B)
session[:identity_url] = identity_url
redirect_to(new_user_path)
end
else
# 認証失敗の場合はエラーメッセージを表示 (C)
failed_login result.message
end
end
end
authenticate_
まず、
次に、
このように、
- 認証成功の場合
- データベースにユーザが登録されていればセッションを生成してログイン成功
(A) - データベースにユーザが未登録であればユーザ登録画面へ
(B)
- データベースにユーザが登録されていればセッションを生成してログイン成功
- 認証失敗の場合
- ログイン画面にエラーメッセージを表示
(C)
パスワード認証の場合と異なり、
ユーザ登録処理
前述の通り、

今回のサンプルではつぶやきの画面に表示するニックネームが必要なので、
もちろん、
ユーザ登録画面から呼ばれるUsersコントローラのcreateメソッドを以下に示します。ユーザ情報のうち、
def create
@user = User.new(params[:user])
# identity_url 属性にセッションで保存した値を代入
@user.identity_url = session[:identity_url]
if @user.save
# ユーザ登録に成功したら home 画面へ移動
redirect_to(user_home_path)
else
render :action => "new" }
end
end
ユーザ登録が終わると、
まとめ
今回はOpenID Authenticationプラグインを使って、
念のために書いておきますが、
次回は今回のサンプルアプリケーションを拡張し、