ぞえの技術めも

Ruby on Rails勉強中

【84日目】【1日20分のRailsチュートリアル】【第8章】セッション永続化のために記憶トークンを生成する

Ruby on Railsチュートリアル(第3版)

今日は「8.4 [このアカウント設定を保存する]」から。

8.4 [このアカウント設定を保存する]

本節では、ユーザーログインをデフォルトで保持するように変更し、
(中略)
前者はGitHubやBitbucketで、後者はFacebookTwitterでそれぞれ採用されています。

商用向けサイトでも使える方法を学べるのいいね。

8.4.1 記憶トークンと暗号化

本節では、セッションの永続化の第一歩として記憶トークン (remember token) を生成し、cookiesメソッドによる永続的cookiesの作成や、安全性の高い記憶ダイジェスト (remember digest) によるトークン認証にこの記憶トークンを活用します。

セッションは簡単だったけど永続的にしてセキュリティも確保しようとすると色々しないと駄目なんだな。。。

それでは最初に、必要となるremember_digest属性をUserモデルに追加します。

マイグレーションを作成してそのまま実行。
データベースにremember_digest属性ができました。

$ rails generate migration add_remember_digest_to_users remember_digest:string
      invoke  active_record
      create    db/migrate/20161206021530_add_remember_digest_to_users.rb
$ bundle exec rake db:migrate

ここで、記憶トークンとして何を使用するかを決める必要があります。

ランダムな文字列生成にSecureRandomモジュールのurlsafe_base64メソッドを使うのがいいらしい。

app/models/user.rb

  # ランダムなトークンを返す
  def User.new_token
    SecureRandom.urlsafe_base64
  end

有効なトークンとそれに関連するダイジェストを作成できるようにします。

さっき追加したUser.new_tokenを使ってトークンのダイジェストをデータベースに保存する。

app/models/user.rb

class User < ActiveRecord::Base
  attr_accessor :remember_token
  :
  # 永続的セッションで使用するユーザーをデータベースに記憶する
  def remember
    self.remember_token = User.new_token
    update_attribute(:remember_digest, User.digest(remember_token))
  end
end

トークンをどう使うのかしっかりイメージできてないけどこれからかな。

今日の作業時間は【29分】

次は「8.4.2 ログイン状態の保持」から。