9.1 Remember me 機能
ユーザーのログイン状態をブラウザを閉じた後でも有効にする [remember me] 機能永続クッキー (permanent cookies) を使ってこの機能を実現していきます
9.1.1 記憶トークンと暗号化
1:記憶トークンにはランダムな文字列を生成して用いる。
2:ブラウザのcookiesにトークンを保存するときには、有効期限を設定する。
3:トークンはハッシュ値に変換してからデータベースに保存する。
4:ブラウザのcookiesに保存するユーザーIDは暗号化しておく。
5:永続ユーザーIDを含むcookiesを受け取ったら、そのIDでデータベースを検索し、
記憶トークンのcookiesがデータベース内のハッシュ値と一致することを確認する。
最初に、必要となるremember_digest属性をUserモデルに追加
rails generate migration add_remember_digest_to_users remember_digest:string
rails db:migrate
あるurlsafe_base64メソッドを使う
app/models/user.rb
class User < ApplicationRecord
# ランダムなトークンを返す。追加
def User.new_token
SecureRandom.urlsafe_base64
end
end
実装計画としては、user.rememberメソッドを作成することで、
このメソッドは記憶トークンをユーザーと関連付け、トークンに対応する記憶
ダイジェストをデータベースに保存します。
Userモデルには既にremember_digest属性が追加されていますが
remember_token属性はまだ追加されていません。
このためuser.remember_tokenメソッドを使ってトークンにアクセスできるようにし、トークンをデータベースに保存せずに実装する必要があリます。
仮想のpassword属性はhas_secure_passwordメソッドで自動的に作成されましたが、今回はremember_tokenのコードを自分で書く必要があります。
attr_accessorを使って「仮想の」属性を作成します。
class User < ApplicationRecord attr_accessor :remember_token . . . def remember self.remember_token = ...update_attribute(:remember_digest, ...) end end
selfキーワードを与えると、この代入によってユーザーのremember_token属性が期待どおりに設定されます。
rememberメソッドの2行目では、update_attributeメソッドを使って記憶ダイジェストを更新しています。
ユーザーを記憶するには、記憶トークンを作成して、そのトークンをダイジェストに変換したものをデータベースに保存します。
新しいトークンを作成するためのnew_tokenメソッドを作成
remember
メソッドをUserモデルに追加する green
app/models/user.rb
class User < ApplicationRecord
attr_accessor :remember_token 中略 ↑追加↓
# 永続セッションのためにユーザーをデータベースに記憶する
def remember
self.remember_token = User.new_tokenupdate_attribute(:remember_digest, User.digest(remember_token)) end
end