心はいつも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

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

  関連記事

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

10.3.4マイクロポストを削除する、です。 仕様 マイクロポスト個別に削除でき …

no image
Everyday Rails3章 バリデーションをテストする

さっき、Aaronを削除したらテスト失敗することを確認しましたが、名前入力無しの …

no image
電源が入らない!MacBookAirが真っ黒になりました。

iPhoneを買ったばかりの頃、iPhoneのメーラーを立ち上げても中身が表示さ …

no image
iPhoneの月請求は8円のみです。

昨年11月に、e-mobileからiPhoneにMNPしました。 ちょうど、乗り …

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

10.3.3フィードの原型、です。 仕様の確認 ユーザーログイン後、トップページ …

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

第6章ユーザーのモデルを作成する。です。ここから開発っぽくなってきます。って今ま …

パーフェクトRuby 2章Rubyの基礎 2-8 様々な代入式

p66 2-8-1 多重代入 まとめて代入する横着なやり方。 a,b = 1,2 …

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

9.2認可、です。 自分以外の人が自分のProfileを変更できないようにします …

もうあかん!Mac OSXのスクロールを逆にする

OSXのいつのバージョンからだっけ? スクロールの向きが突如逆になったんですよね …

パーフェクトRuby 3章制御構造/メソッド/組み込み関数 3-1演算子

パーフェクトRuby2章の後は6章をやろうと思っていましたが、やっぱり順番にやっ …