いますぐ使えるOpenID

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

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

ログイン処理の修正(Sessionsコントローラ)

まずはログイン画面から修正します。これまでのログイン画面はOpenIDのアカウント名を入れるフォームが存在するだけでした。ここに,IDとパスワードを入力するためのフォームを追加します。

図2 ログイン画面のスクリーンショット

図2 ログイン画面のスクリーンショット

OpenIDでのログインとパスワードでのログインのどちらであっても,フォームに入力したデータはSessionsコントローラのcreateアクションが受け取ります。createアクションはどちらのデータも受け取れるようにします。具体的な修正方法は,OpenID AuthenticationプラグインのREADMEが参考になります。修正後のcreateアクションは以下のようになります。

  def create
    if using_open_id?
      # OpenID による認証
      open_id_authentication
    else
      # パスワードによる認証
      password_authentication
    end
  end

using_open_id?はOpenID Authenticationプラグインが提供するメソッドです。クライアントから送られるクエリストリングやフォームのデータから,OpenID認証のリクエストかどうかを判定します。OpenID認証のリクエストであれば,open_id_authenticationメソッドを呼び出し,そうでなければpassword_authenticationメソッドを呼び出します。それぞれのメソッドはprotectedで宣言し,外部からは直接呼ばれないようにします。

図3 createアクションによる振り分け処理

図3 createアクションによる振り分け処理

open_id_authenticationメソッドは第4回のcreateアクションの処理と同じです。認証に成功してユーザが登録されていればサービス画面に遷移し,登録されていなければユーザ登録画面に遷移します。

  def open_id_authentication
    # OpenID でユーザを認証する (begin, completeの両方に対応)
    authenticate_with_open_id do |result, identity_url|
      # 第4回と同じコードのため省略
    end
  end

password_authenticationメソッドは,RESTful Authenticationプラグインが生成するコードを流用し,以下のように作成しました。

  def password_authentication
    # ID とパスワードでユーザを認証する
    self.current_user = User.authenticate(params[:login], params[:password])
    if logged_in?
      # サービス画面へ遷移する
      successful_login
    else
      failed_login 'ユーザIDまたはパスワードが異なっています'
    end
  end

ちなみに,認証後の処理はこれまでと同様です。

ユーザ登録処理の修正(Usersコントローラ)

パスワード認証の利用者とOpenID認証の利用者では,ユーザ登録に必要な情報も異なります。

  • パスワード認証 … ユーザが入力したパスワードを登録する
  • OpenID認証 … OpenID認証によって確認できたOpenIDアカウント名(User-Supplied Identifier)を登録する

パスワード認証の場合のユーザ登録画面は,以下のようになります。ユーザID, ニックネーム, パスワードの入力を要求します。メールアドレスによるアクティベーションを行う場合は,メールアドレスの入力も必要になるでしょう。

図4 パスワード認証利用時のユーザ登録画面

図4 パスワード認証利用時のユーザ登録画面

OpenID認証の場合のユーザ登録画面は,以下のようになります。こちらはパスワードを入力せずに,ユーザのOpenIDアカウント名を登録します。

図5 OpenID認証利用時のユーザ登録画面

図5 OpenID認証利用時のユーザ登録画面

著者プロフィール

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

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