ひろしとRailsチュートリアルと - その4 : 認可, パスワード再設定

長かったチュートリアルももう終盤。。(›´ω`‹ )

認証に関わるチュートリアルが続いてなかなかのボリュームだった。

10章 (ユーザーの更新・表示・削除)

f:id:hiroshings:20180529002325p:plain

ログインしてなくても誰かのユーザー情報が編集できてしまう超絶ヤバイ状態から認可の仕組みを導入した。

フレンドリーフォワーディングでは、遷移先の保存に session を再度利用した。 will_paginate gem を使ってページネーションを実装したが、JSで昔スクラッチで書いたときに比べてめちゃくちゃ楽で驚いた。

  • before_action を使ったフィルタ (ログイン済みチェック / 自分の編集ページかチェック)
  • フレンドリーフォワーディング (ログイン後、ログイン前にアクセスしようとしたページに戻してあげるやつ)
  • ユーザー一覧
  • ページネーション

を学んだ。

11章 (アカウントの有効化)

メーラーを使ってユーザーが本当にそのメールアドレスの持ち主なのか検証する仕組みを実装した。

  • メーラーrails generate で生成できる。 (plainText / html)
  • プレビュー用のclassが自動生成され、config/environments/development.rb を編集するとメールを送らなくてもメールの確認ができる←便利

ことを学んだ。

Rubyメタプログラミングを使った抽象化を体験した。
下記の例だと、 send メソッドで引数にシンボル名と同じStringを指定し、動的にシンボルを取得している。
まじか、黒魔術すぐる..といった感想😨

def authenticated?(remember_token)
  digest = self.send("remember_digest")
  return false if digest.nil?
  BCrypt::Password.new(digest).is_password?(remember_token)
end

def authenticated?(attribute, token)
  digest = send("#{attribute}_digest")
  return false if digest.nil?
  BCrypt::Password.new(digest).is_password?(token)
end

12章 (パスワード再設定)

11章の振り返りのようなメーラーを使ったパスワードリセットの仕組みを作った。 ところどころ Controller の責務過多な部分を User モデルや SessionHelper に逃すリファクタが演習に含まれていて普通にリファクタリングの勉強になる。

パスワードリセットやアカウント有効化の実装はフロントエンドなら経験があったが、概念だけ分かってる部分もサーバーサイドの実装を経験することによってより理解が深まって良かった。

ひろしとRailsチュートリアルと - その3 : アカウント作成, ログイン

本業のiOS開発がバタバタしていて、前回から2週間空いてしまった。 今日は7, 8, 9章を進めた。

7章

ユーザーページの作成とアカウント作成画面を実装した。

  • debugメソッド
  • Railsが用意している環境3つ(test, development, production)
  • User.find(params[:id])してユーザーページの表示
  • ユーザーのGravatarを表示する初めてのヘルパーメソッド
  • formでpost -> createメソッドでパラメータを受け取ってControllerでロジック実装
  • エラーハンドリング
  • Strong Prameters
  • 本番環境でSSLを使う方法

を学んだ。

サイトにデバッグ情報を出力できる debug(params) メソッド。 アプリで同じようなことをやろうとすると、ライブラリを使うか、log出力用の関数を自分で書かないといけないので、こういった需要に応じたメソッドが用意されてるのはフレームワークの素晴らしさだと思った。

Strong Parameters を使うことで、paramsハッシュのパラメータを指定できること。これを使わないとcurlとかで容易に悪意あるリクエストが送れることを学んだ。

なんかこの章めっちゃ長くて、Togglで勉強時間を計測しているのだが、3時間半近くかかって疲れた。。

8章

7章(アカウント作成)の知見が活かせて、1/3の時間で終わった。

  • ログイン
  • ログアウト
  • SessionsHelper moduleを定義して、session管理のヘルパーメソッドを実装
  • Sessionに応じた画面の出しわけ
  • ||= 演算子を使った代入

を学んだ。

||= 演算子は左辺がnilだったら右辺で代入するやつで、swiftの ?? 演算子みたいな感じで便利だなと思った。

9章

cookieを使ったsessionの永続化を学んだ。なんとなく知識として分かってはいたが、体系的に自分で実装して学べてよかった。 以下、簡易メモ

セッションの保持

  1. tokenをBase64を使って発行
  2. tokenをハッシュ値に変換
  3. DBに保存
  4. cookieに署名付きcookieを使ってuser_idを保存
  5. cookieにハッシュ化したtokenを保存

ログイン時

  1. cookieからuser_idを取得する
  2. user_idでDBからユーザーを取ってくる
  3. 2のuserのハッシュ化したtokenとcookieに保存しているtokenが一致しているか確かめる

途中、cookieにtokenを保存する箇所で盛大にバグを埋め込んでて、そのまま気づかず過ごしていたのだが章の終盤のテストでバグが明らかになって、テストの素晴らしさを体感した。

作業環境

外で作業するときに、家と違ってサブディスプレイがないのがツラみだったのだが、iPadをサブディスプレイ化する Duet Displayというアプリを見つけて、買ってみたら遅延なくて最高だった。ノマドワークが捗りそう。

ひろしとRailsチュートリアルと - その1 : 初めてのrails new , Cloud9

Railsチュートリアル開始

前回、Railsを初めたきっかけについてまとめた通り、 初学については色んな人から薦めてもらったRailsチュートリアルをやることにした。

続きを読む

ひろしとRailsチュートリアルと - その0 : iOSデベロッパーの僕はRailsを始めようと思った

最近、Railsチュートリアルを使って、Railsの勉強を始めた。 その備忘録として、ブログに勉強の過程をまとめたいと思う。

なぜiOSデベロッパーの僕がRailsを始めようと思ったか?

きっかけ

前職(webディレクター)からエンジニアになったのが2015年の10月。それから2年半の間、Swift, Javascript, html, css, PHPとフロントエンドメインの経験を積んできたけど、スキルセットとしてはSwift (iOSデベロッパー)としてのスキルが9割くらいで、Unixコマンドの知識も浅かったりと、一つのOSに依存した自分のスキルに課題を感じていた。。

続きを読む

引っ越しのTODO・ナレッジをまとめたリポジトリを作った話

引っ越しのTODO・ナレッジをまとめたリポジトリを作った

最近、都内 to 都内で引っ越しをしたのですが、 数年後同じような作業を1から思い出して作業するのか..と思うと辛いので 今回の引っ越し中にメモしていたTODOリストやTIPSをまとめてリポジトリにして公開しました。

f:id:hiroshings:20180108211753p:plain

続きを読む