(1)セッション維持の仕組み
①userテーブルに"remember_token"というカラムを追加し、ログイン認証後にランダムトークンを生成し、データベースに保持しておく。
②上記ランダムトークンをクッキーに設定する。
③同一セッションの後続のページでは、ブラウザのクッキーからこのトークンを取り出し、データベース上で保存されているトークンと照合させる事によってユーザーを特定する事ができる。
(2)設定手順
1)データベースにbase64トークンを保存するカラムを追加
①base64トークンを保存する"remember_token"という名前のカラムをusersテーブルに追加します。
$ rails generate migration add_remember_token_to_users
②"remember_token"を定義し、インデックスを追加
$ vi db/migrate/20141201113639_add_remember_token_to_users.rb
class AddRememberTokenToUsers < ActiveRecord::Migration
def change
add_column :users, :remember_token, :string
add_index :users, :remember_token
end
end
③マイグレーション実行
$ bundle exec rake db:migrate
(2)ユーザーを一意に識別するbase64トークン(remember_token)を生成する処理をUserモデルに定義
①SecureRandomモジュールにあるurlsafe_base64メソッドを使って生成
・Userモデルにnew_remember_tokenメソッドを定義します。
・new_remember_tokenメソッドは、ユーザーのインスタンスに対して動作する必要がないのでインスタンスではなく、Userクラスに属します。(クラスメソッド)
$ vi app/models/user.rb
class User < ActiveRecord::Base
def User.new_remember_token
SecureRandom.urlsafe_base64
end
②railsコンソールで動作確認
2.0.0-p247 :004 > token=User.new_remember_token
=> "_JBOA・・・"
2.0.0-p247 :005 > token=User.new_remember_token
=> "yHwuhZ・・・K"
(3)コントローラに設定追加
1)処理内容
①ユーザーログイン成功
②Userモデルの"new_remember_token"メソッドを使ってremember_tokenを生成
③remember_tokenをブラウザのパーマネントクッキーに保存
④remember_tokenをデータベースに保存
2)コントローラに設定追加
$ vi app/controllers/users_controller.rb
def show
@user = User.find_by(remember_token: cookies[:remember_token])
end
def auth
user = User.find_by(email: user_params[:email].downcase)
if user
remember_token = User.new_remember_token
cookies.permanent[:remember_token] = remember_token
user.update_attribute(:remember_token, remember_token)
redirect_to user
end
end
(4)動作確認
http://localhost:3000/users/login にアクセス
ログイン成功後、ユーザー表示ページに遷移しました。
fidder2でhttpパケットをモニタするとクッキー内に下記が設定されていました。
remember_token=5JxAlY・・・
今回の方法ではユーザーログイン後にSecureRandom.urlsafe_base64を使ってランダムなトークンを生成してクッキーに設定しているので、クッキー内の情報を読まれてもユーザーIDが分かってしまうことはありません。