日別アーカイブ: 2021年11月23日

Rails-tutorial自分用まとめ(第9章 発展的なログイン機構 主に演習)

その8から続く

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
トークンとしてRuby標準ライブラリのSecureRandomモジュールに
ある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

続きを読む