Ruby on Rails 9章序盤 rememberをやりました。
〇remember me
-> 永続クッキー
振り返り
session[:user_id] = user_id
これはsessionメソッドを使ったもので、後ろではcookieが焼かれるが、ブラウザを閉じたらもう終わり。
〇新しくやること
・passwordのダイジェストと同じ要領で,rememberトークンのダイジェストを持つ。
・rememberトークンをcookieを焼いてブラウザに食わせる。
・rememberトークンをhashして、rememberトークンのダイジェストが取れれば認証。
rails generate migration add_remember_dist_to_users remember_digest:string
ruby on rails tutorialで、「ユーザーの暗号化済のID」と言っているやつは、「署名付きのid」であり、トークンのダイジェストとは別。
「署名付きのid」と「rememberトークン」のペアを、
有効期限とともに保存するのが今回の範囲。
〇パスワードを思い出せ
(モデルにはもたない)仮想のパスワード属性と、
データベース上のパスワードダイジェスト
という関係。
あの時はhas_secure_passwordで作った。←モデルに書いてるよ
(※password_digestという項目がある状態なら,password, password_confirmationが使えるんだった)
今回はパスワードじゃないから自分で定義する。
#モデルに追加
#仮想的な属性を追加
attr_accessor :remember_token
def remember
self.remember_token = ‘トークンを設定’
update_attribute(:remember_digest, ‘トークンのダイジェスト’)
end
#update_attributeだとパスワードの入力いらない。
〇核心
・焼く
cookies.permanent[:remember_token] = remember_token
cookies.permanent.signed[:user_id] = user.id
※permanentは20年後に有効期限を設定する。
・読む
cookies.signed[:user_id] →non signedなユーザidが取れる。
cookies[:remember_token]
・判定
BCrypt::Password.new(‘ダイジェスト’).is_password?(‘トークン’)