心はいつもAirPucci (空元気でもいいから)

毎日がPucciを着ているような気分

RailsTutorial4.0を高速で復習する。8.2.1章。

      2014/02/01


8.2.1[このアカウント設定を保存する]、です。

RailsTutorial4.0を高速で復習する、のに、全然低速になっています。承認と認証、Sessionまわりが一番の山場だと思うんですよーなのでじっくり低速でいってます。

Sessionの永続化

サインイン状態を「永続化」し、ユーザーが明示的にサインアウトしたときにのみセッションを終了します。

後日あらためてサイト訪問してもログイン状態が保持されているあれです。

ここでRailsのヘルパー関数をviewではなくcontrollerで使うという技をつかっています。
そして、わからない。

Sessionsコントローラには既にSessionsHelperというモジュールが備わっています。

Sessionsコントローラって、さっきrails g して作ったあれでしょ。自分で作ったものに最初からそなわっているはずはありません。

リスト8.14 SessionsヘルパーモジュールをApplicationコントローラにインクルードする。
app/controllers/application_controller.rb

class ApplicationController < ActionController::Base
  protect_from_forgery with: :exception
  include SessionsHelper
end

こういうふうにApplicationControllerでinclude SessionsHelperしたあとなら、SessionsコントローラでもSessionsHelper使えます。原文がわかりづらい説明なのか誤訳なのか、原文みていないのでわかりませんが、、
原文見てみました。

but the Sessions controller already comes equipped with a module, namely, SessionsHelper.

セッションコントローラー用途にはSessionsHelperというモジュールがあります。

くらいでいいのでは?あのような訳文なので、Sessionsコントローラ = SessionsController = session_contoroller.rbで定義してあるclass でしょと思い、
Sessionsコントローラって自分でrails gしても何か魔法があるのか散々検索しました。ここは訳文がわかりづらい。

そして散々検索した結果、いまだよくわからないのがSessionsHelperの実態。どこで定義されているんだ、、わからぬ。

=>ここにドキュメントがありました。
http://rubydoc.org/github/Mab879/iscore-rails/SessionsHelper

次の:remember_tokenの説明もわかりづらい。

記憶トークンのテストを書く

なにはとまれ、:remember_tokenの説明もわかりづらいのが続くのですが、いったんおいといて、テストを書きます。

リスト8.15 記憶トークン用の最初のテスト。
spec/models/user_spec.rb

require 'spec_helper'

describe User do
略
  it { should respond_to(:password_confirmation) }
  it { should respond_to(:remember_token) }
  it { should respond_to(:authenticate) }
略
end

userにremember_tokenを追加する

データモデルをER図で考えているのもRailsTutorialのいいところです。まだUserモデルだけなのでERかどうかわかんないですが。

user_model_remember_token_31

Userにremember_tokenカラムを追加します。

rails g migration add_remember_token_to_users

ユーザーを記憶トークンで検索できるように、インデックス をremember_tokenカラムに追加してからrake dbします。

リスト8.16 remember_tokenをusersテーブルに追加したマイグレーション。
db/migrate/[ts]_add_remember_token_to_users.rb

class AddRememberTokenToUsers < ActiveRecord::Migration
  def change
    add_column :users, :remember_token, :string
    add_index  :users, :remember_token
  end
end
bundle exec rake db:migrate
bundle exec rake test:prepare

記憶トークンに何を使用するかを決める

一意性を確保できる、長くてランダムな文字列

ということで、
SecureRandomモジュールにあるurlsafe_base64メソッドを採用とのこと。

このメソッドは、A–Z、a–z、0–9、“-”、“_”のいずれかの文字 (64種類) からなる長さ16のランダムな文字列を返します (そのためbase64と呼ばれています)。生成された2つの記憶トークンが偶然一致 (衝突) する確率は、64のマイナス16乗、2のマイナス96乗 (10のマイナス29乗) にほぼ等しく、トークンが衝突することはまずありません。

で、ここからセキュリティの肝心な話ですが、

ブラウザにこのbase64トークンを保存しておき、データベースにはトークンを暗号化したものを保存することです。そして、cookiesからこのトークンを読みだして暗号化し、データベース上にある暗号化された記憶トークンと一致するものがあるかどうかを検索することにより、ユーザーを自動的にサインインさせることができます。暗号化したトークンだけをデータベースに保存する理由は、万が一データベースが不正アクセスを受けるようなことがあっても、攻撃者が記憶トークンを使用してサインインできないようにするためです。

ここはいいです。その次。

記憶トークンをさらにセキュアにするためには、新しいセッションを作成するたびにトークンを更新するのがよい方法です。この方法なら、攻撃者が盗んだcookiesを使用して本物のユーザーになりすましてサインインしようとする (セッションハイジャック) ことがあっても、ユーザーが次回サインインするときにはトークンが期限切れになります。

え〜普通これ実装しないか??RailsTutorialではこの実装していないので、セッションハイジャックの危険性は残ります。gemのdeviseとかどうやってるんだろか。アプリ全体をSSL化しろだと?ま、いいけど本質的じゃないだろー。つか、RailsがWebアプリフレームワークというならこれRails側で実装すべきだろーやってるの?やってるの?別途調べる事項とする。

ブログに書いている方がいらっしゃいました。
Rails SessionにCookieStore使った時の問題点

ちょっとRailsのセキュリティで悶々としてしまったので、次途中からですが
リスト8.17 記憶トークンが有効である (空欄のない) ことをテストする。
からです。

 - テクニカル ,

Message

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

  関連記事

RailsTutorial4.0を高速で復習する。10章。

第10章ユーザーのマイクロポスト、です。 has_many、belongs_to …

no image
RailsTutorial4.0を高速で復習する。7.1.2章

7.1.2ユーザーリソース、です。 /user/newを/signupで表示させ …

no image
before_actionが定義してある。

ruby on rails3プリケーションプログラミングの本の内容をruby2. …

Mac miniの液晶モニターにDell U2713HM使っています。

次期モデルが出るかもしれないのにMac miniを買って、自分でメモリを16Gに …

herokuのWe’re sorry, but something went wrong.に苦しんだ

Rails3.2環境に戻してアプリを作ろうとしています。 herokuにpush …

RailsTutorial4.0を高速で復習する。11.3章。

11.3ステータスフィード、です。 11.3.1動機と計画、です。 仕様 mic …

rails gでのファイル名、クラス名、アクション名

rails gすると、コントローラーとアクションができますが、 その書き方とファ …

RailsTutorial4.0を高速で復習する。8章。

仕様の探求 userモデルには、登録と認証、承認に必要なモデルは既に作ってありま …

40秒も待てない。

自由が丘のカフェでこれ書きました。Table Modern Service、食べ …

詳解 Objective-C 2.0 第3版 CHAPTER2 Objective-Cのプログラム

Objective-Cの解説はメッセージから始まる。このメッセージという概念、も …