#はじめに
Railsチュートリアル9章を勉強していて、自分の中に落とし込むためにまとめてみることにしました。
#前提知識
HTTP通信は基本ステートレスな通信
ステートレスとは・・・ページ遷移の際など前の情報を引き継がない
しかし、ショッピングサイトのカートの中身など引き継いでいきたい場合もある。
その場合、ステートフルにしないと困る。
ここで用いられるのがsession管理。
session:接続中のユーザーの行動履歴
cookie:自分が誰なのかを証明するもの
#9.1.1 記号トークンと暗号化
・Remember me機能とは
ブラウザを閉じた後でもユーザーのログイン状態を保持するもの
例.Twitter
記憶トークン(remember token)を生成し、cookiesメソッドによる永続的cookiesの作成や、安全性の高い記憶ダイジェスト(remember digest)によるトークン認証にこの記憶トークンを活用する。
cookieには、セキュリティの観点からパスワード等をそのまま保存するのではなく、トークンを利用する。
class AddRememberDigestToUsers < ActiveRecord::Migration[6.0]
def change
add_column :users, :remember_digest, :string
end
end
記憶ダイジェスト用にマイグレーションを作成する。これでdbにremember_digestカラムが追加される。
記憶ダイジェストとは、記憶トークンをそのままDBに保存するのではセキュリティ的に問題があるので、ダイジェストに変換したもの
def User.new_token
SecureRandom.urlsafe_base64
end
end
新しいトークンを作成するため、User.new_tokenメソッドを定義
この際、urlsafe_base64メソッドを使う。(ランダムな文字列がほしいだけ)
class User < ApplicationRecord
attr_accessor :remember_token
.
.
.
def remember
self.remember_token = ...
update_attribute(:remember_digest, ...)
end
end
仮想のremember_token属性を作成。
rememberメソッドの一行目では、ローカル変数と区別するために、self.remember_tokenと記述。
# 永続セッションのためにユーザーをデータベースに記憶する
def remember
self.remember_token = User.new_token
update_attribute(:remember_digest, User.digest(remember_token))
end
end
rememberメソッドを使って、ユーザーに記憶ダイジェスト(remember_digest)を追加!
ここでは、remember_tokenをUser.digestで変換し登録している。
#9.1.2 ログイン状態の保持
9.1.1でUser.rememberメソッドを定義し動作できるようになったため、ユーザーの暗号化済みIDと記憶トークンをブラウザの永続cookiesに保存して、永続セッションを作成する準備ができた。
これを実際に行なっていくためにcookiesメソッドを使用。
cookiesは、1つのvalue(値)とexpires(有効期限)からなる。このexpiresを20年にすることで実質永続的なセッションを作ることが可能。
cookiesの設定
参照リファレンス:https://docs.ruby-lang.org/ja/latest/class/CGI=3a=3aCookie.html
cookies[:remember_token] = { value: remember_token,
expires: 20.years.from_now.utc }