9.1 Remember me 機能
ブラウザを閉じてから再度開いてもログイン状態が継続できるようにする。
8章ではsessionメソッドを使って一時的なセッション(ブラウザを閉じるまで)を実現したが、9章ではcookiesメソッドを使ってセッションの永続化を行う。
cookiesを永続化するとセッションハイジャックという攻撃を受ける可能性があるので注意が必要だが、Railsだと対策ができているので大丈夫らしい(知らんけど)。
ここらへんから説明がややこしくなって脱落しそうになってくる。
やっていることはパスワードの実装と似ていて、
- ランダムなトークンを生成する
- 生成したトークンをハッシュ化し、DBに保存する。このトークンでクッキーのuser_idで指定されたユーザーが正規のユーザーであることを確認する
cookies.permanent.signed[:user_id] = user.id)
- cookiesに生成したトークンとuser_idを保存する
- cookiesからトークンを取り出し、DBに保存されたハッシュ化したトークンと比較する
の4つ。
いったん文章は理解できなくてもコードを書ききった後に、cookieとセッションに関する説明記事と照らし合わせながらコードを理解すると良さそう。
ポイント
-
attr_accesor
- ゲッターとセッターの同時指定で、インスタンス変数にアクセス可能になる。
- selfキーワード
- おそらくinitializeでインスタンス変数を設定しないクラスの場合はメソッド内でself.変数で指定しないとインスタンス変数ではなくローカル変数として新たに変数が作成されてしまうということのよう。
- 署名付きcookie
- cookieをブラウザに保存する前に安全に暗号化する
- cookiesからのユーザー取り出し
User.find_by(id: cookies.signed[:user_id])
9.2 [Remember me] チェックボックス
割愛
9.3 [Remember me] のテスト
- テスト内ではcookiesメソッドにシンボルを使えないらしい
- テストの分岐にraiseを仕込むとそのテストが正常にテストされているかどうかわかる(一度も通過していないことになるので)