本章の趣旨
- 8章で実装した基本的なログイン機能に加えて、ラウザを再起動した後でもすぐにログインできる機能 (remember me) を実現する
9.1 Remember me 機能
- 8章ではsessionメソッドを用いてcookieにユーザIDを保存したが、sessionメソッドではブラウザを閉じるとデータが消えてしまう
- 永続的なcookieを作成するために、cookiesメソッドを用いて記憶トークンを作成する
- データベースの情報を抜き取られた場合に備えて、記憶トークンはハッシュ化してデータベースに保存する
- トークン生成用メソッドの追加
app/models/user.rb
def User.new_token
SecureRandom.urlsafe_base64
end
- ハッシュ化したトークンをデータベースに保存する
app/models/user.rb
def remember
self.remember_token = User.new_token
update_attribute(:remember_digest, User.digest(remember_token))
end
- cookiesメソッドでは有効期限を設定できる
- Railsでは20年で期限切れになるcookies設定を行うための特別なメソッドが用意されている
cookies.permanent[:remember_token] = remember_token
- ユーザIDをcookieに保存する。IDが見られることを防ぐために署名つきcookieを使用する
cookies.signed[:user_id] = user.id
- 記憶トークンと同じく、ユーザIDも永続化させる必要があるためsignedとpermanentをメソッドチェーンで繋ぐ
cookies.permanent.signed[:user_id] = user.id
- 以下のようにcookiesからユーザを取り出せるようになる
User.find_by(id: cookies.signed[:user_id])