Ruby on Rails

【Ruby on Rails】チュートリアル 「第8章 ログイン、ログアウト」をやってみた

Ruby on Rails チュートリアルの第8章のメモです。第8章ではこれまたWebアプリケーションに欠かせないログイン・ログアウト機能を実装していきます!認証(authentication)システムの実装方法を学ぶことができます!

第8章 ログイン、ログアウト | Rails チュートリアル

Railsチュートリアル第8章をやってみた

セッション

HTTPはステートレスなプロトコル

  • 前のリクエスト情報をまったく利用できない独立したトランザクション
  • セッションという半永続的な接続をコンピュータ間に別途設定する

Railsでセッションを実装するのに簡単なのがcookies
cookiesとはユーザのブラウザに保存される小さなテキストデータ

今まで設定したルーティングの確認

bundle exec rake routes

レンダリングのないページにフラッシュメッセージを残す

flashではなくflash.nowを使う

sessionメソッド

使用するとユーザのブラウザ内の一時cokkiesに暗号化済みのユーザIDが自動で生成される

メモ化コードを意識する!

if @current_user.nil?
  @current_user = User.find_by(id: session[:user_id])
else
  @current_user
end

一行で書くと、

@current_user = @current_user || User.find_by(id: session[:user_id])

さらにRubyっぽく書くと

@current_user ||= User.find_by(id: session[:user_id])

RailsにおけるRememer me

Railsのsessoinメソッドを単に使用するだけでは、ブラウザを閉じるとセッション情報は消えてしまう
永続的Cookiesの作成は、セキュリティ上の欠陥が生まれやすいので注意する必要がある
cookieを盗み出す有名な4つの方法

  1. パケットスニファ
  2. データベースから直接記憶トークンを奪う
  3. クロスサイトスクリプティング(XSS)
  4. 物理的デバイスを直接操作

以下の方針をとってRemember meを実現

  1. 記憶トークンにはランダムな文字列を生成して用いる。
  2. ブラウザのcookiesにトークンを保存するときには、有効期限を設定する。
  3. トークンはハッシュ値に変換してからデータベースに保存する。
  4. ブラウザのcookiesに保存するユーザーIDは暗号化しておく。
  5. 永続ユーザーIDを含むcookiesを受け取ったら、そのIDでデータベースを検索し、記憶トークンのcookiesがデータベース内のハッシュ値と一致することを確認する。

テストされたいない箇所を発見するためのノウハウ

raiseを怪しい部分に埋め込んで例外を無理やり発生させる
テストを実行してエラーが発生しなかったらカバーできていない

Ruby on Rails チュートリアル 「第8章 ログイン・ログアウト」のまとめ

  • Railsでは、あるページから別のページに移動するときに状態を保持できる
    • 一時cookiesと永続cookiesどちらも使える
  • flash.nowメソッドを使うと、レンダリング済みのページにもフラッシュを使える
  • テスト駆動開発は、テストでバグを再現してからのデバッグに便利
  • sessionメソッドを使用すると、ユーザのIDを安全にブラウザに保存してくれ一時セッションを作成できる
  • 統合テストでは、ルーティング、データベースの更新、レイアウトの変更などをテストできる
  • cookiesメソッドを使用すると、永続的な記憶トークンのcookiesをブラウザに保存して、永続的セッションを作成できる
  • セッションのユーザIDを削除し、ブラウザの永続的cookiesを削除すると、ログアウト!

ログイン・ログアウト周りはボリュームがすごかった
コーディングするので精一杯
3時間かかった
Ruby on Rails チュートリアル 第8章までかかった合計時間は13.5時間

続きの記事はこちら!
Ruby on Rails チュートリアル 「第9章 ユーザの更新、表示、削除」をやってみた

Ruby on Railsのおすすめ書籍はこちら!


-Ruby on Rails