Rails Tutorial 9章 編集中
Remember_me 機能
よくあるやつ。次回以降ログインを省略みたいな。
手順としては、
1、記憶トークンを作成
2、ユーザーと関連づける
3、CookieメソッドでDBに保存
$ rails g migration add_remember_me_digest_to_users remember_digest:string
$ rails db:migrate
記憶トークンには、安全性の高いものを使いたい。Ruby標準ライブラリのurlsafe_base64メソッドがいい。
def User.new_token SecureRandom.urlsafe_base64 end
ここから、 user.remember メソッドを作成して、これで記憶トークンをユーザーと関連づけ、トークンに対応する記憶ダイジェストをDBに保存
しかし、保存場所であるremember_token属性が追加されていない。
そこで、user.remember_token でトークンにアクセスできるようにする。(DBには保存しないように)
パスワードで使ったように、仮想のpasswordを作ったみたいに。
rememberメソッドをUserモデルに追加する
attr_accessor :remember_token . . def remember self.remember_token = User.new_token update_attribute(:remember_digest, User.digest(remember_token)) end
※ DBにアクセスする必要がないため、attr_accesorでremember_tokenを定義
※ update_attribute はバリデーションを通過可能(passにアクセスしなくていい)
ここで、Cookieメソッドの使い方。
sessionのようにハッシュで使用可能で、一つの値と、オプションのexpiresで構成されている
cookies[:remember_token] = { value: remember_token, expires: 20.years.from_now.utc }
これを permanent メソッドで書き換えて、
cookies.permanent[:remember_token] = remember_token
ユーザーIDをCookieに保存するには(署名あり)
cookies.signed[:user_id] = user_id
記憶トークンとペアで使うために
cookies.permanent.signed[:user_id] = user_id
以上より、以後のページでcookieからユーザーを取り出すことができる。
んで、なんたらかんたら
app/models/user.rb def authenticated?(remember_token) BCrypt::Password.new(remember_digest).is_password?(remember_token) end
この remember_token は、さっきのアクセサのやつじゃなくただのローカル変数。
remember_digest は、self.remember_digestと同じ使い方らしい。
app/controllers/sessions_controller.rb def create . . remember user . end
app/helpers/sessions_helper.rb #ユーザーのセッションを永続的にする def remember(user) cookies.permanent.signed[:user_id] = user_id cookies.permanent[:remember_token] = user.remember_token end