Hatena::Groupkdri

KazusaAPI開発日誌 このページをアンテナに追加 RSSフィード

2007-10-11

acts_as_authenticated から open_id_authentication への移行

|  acts_as_authenticated から open_id_authentication への移行 - KazusaAPI開発日誌 を含むブックマーク はてなブックマーク -  acts_as_authenticated から open_id_authentication への移行 - KazusaAPI開発日誌  acts_as_authenticated から open_id_authentication への移行 - KazusaAPI開発日誌 のブックマークコメント

目次

  • [Rails][認証] acts_as_authenticated から open_id_authentication への移行
    • 対象アプリケーションの構成
    • 参考にしたもの
    • 手順
    • 構成比較
      • コントローラーはデフォルトの名前が異なる。
      • User モデル
    • 上書き(*)や追加(+)したファイルとマージ(M)したファイル
    • テーブルの更新
    • サーバの起動とログインの検証
      • OpenID でのログイン
      • いままでのログインアカウントでのログイン
    • まとめ

(書きかけです。)

仮運用中で開発中のアプリケーションに OpenID でのログイン機能を追加する手順を記録します。最終的にはOpenIDでのログインだけにしたいのですが、一定期間はいままでのアカウントでもログインできるようにするために、データを保持したままでいままでのログイン認証とOpenID認証の両方ができるようにします。


対象アプリケーションの構成

  1. rails 1.2.3
  2. acts_as_authenticated で認証している
  3. ソーシャルブックマークのようなアプリケーション

参考にしたもの

手順

  1. 404 Not Foundにある example Ruby on Rails OpenID application をダウンロード
  2. acts_as_authenticated の構成と比較
  3. アプリの中でマージする
  4. ログインできるようになるまで調整する

構成比較

コントローラーはデフォルトの名前が異なる。
画面acts_as_authenticatedopen_id_authentication
ログイン画面/account/login/session/index
OpenIDプロバイダ
ログイン後//
User モデル

users テーブルはopen_id_authenticationが上位互換になっている。

acts_as_authenticatedopen_id_authentication
loginlogin :string
emailemail :string
crypted_passwordcrypted_password:string, :limit => 40
saltsalt:string, :limit => 40
created_atcreated_at:datetime
updated_atupdated_at:datetime
remember_tokenremember_token:string
remember_token_expires_atremember_token_expires_at:datetime
activation_code:string, :limit => 40
activated_at:datetime
identity_url:string

User モデルはopen_id_authentication が上位互換になっている。

  1. if not_openid? が追加されている
  2. activation に関するコードが追加されている
  3. remember_me_for や remember_me_until の追加

比較の結果、メソッド名的には上位互換のようなので、名前の重なるファイルを上書きしてマージすることに。

上書き(*)や追加(+)したファイルとマージ(M)したファイル

  • + app/helpers/sessions_helper.rb
  • + app/models/user_notifier.rb
  • M app/models/user.rb
  • + app/models/user_observer.rb
  • M app/controllers/user_controller.rb
  • + app/controllers/users_controller.rb
  • + app/controllers/session_controller.rb
  • + app/views/session
  • + app/views/user_notifier
  • + app/views/users
  • M config/route.rb
  • + db/migrate/010_update_users.rb
  • + db/migrate/011_add_open_id_authentication_table.rb
  • * lib/authenticated_test_helper.rb
  • * lib/authenticated_system.rb
  • + vendor/plugins/open_id_authentication/
  • + vendor/plugins/restful_authentication/

db/migrate/010_update_users.rb 増えたフィールドを add_column するものです。

テーブルの更新

% rake db:migrate

サーバの起動とログインの検証

OpenID でのログイン
  1. サーバを起動し
  2. http://localhost:3000/session/ をブラウザで開き
  3. OpenIDを入力し
  4. 「Sign in」をクリック
  5. OpenIDプロバイダーにリダイレクトされて
  6. 認証すると
  7. ログインできました。

おもいのほかあっさりいきました。

いままでのログインアカウントでのログイン
  1. http://localhost:3000/session/ をブラウザで開き
  2. Login:にアカウント名、Password:にパスワードを入力し
  3. 「Sign in」をクリック
  4. http://localhost:3000/session/ のままでした。

この状態では、user.activated_at が空になっているので、いままでのアカウントでログインすることができなくなります。アカウントがアクティベートされていないと見なされているからです。

この段階では、アカウントの activation は console でつぎのようにしておこなうことができます。

>> User.find(1).activate

プラグインとしては、activation_code 付きのURLをメールで送って、それをクリックさせることを意図しているようです。

activation 後は、いままでのアカウントで正常にログインできるようになりました。


まとめ

  • データを保持したまま acts_as_authenticated から open_id_authentication への移行をしました。
  • モデルやテーブルが上位互換になっていたので、上書きできました。
  • activation の問題でいままでのアカウントが使えない状態になっていました。
  • 最終的には OpenID 認証でのログインといままでのアカウントでのログインがおこなえました。