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