techium

このブログは何かに追われないと頑張れない人たちが週一更新をノルマに技術情報を発信するブログです。もし何か調査して欲しい内容がありましたら、@kobashinG or @muchiki0226 までいただけますと気が向いたら調査するかもしれません。

Rails Tutorial 5 Account activation

Rails Tutorial 5 Account activation

新規登録ユーザーにメールを送信し、記載されている URL を踏むことで有効化する、"アカウントの有効化" を実装する。
これにより、本当に有効なメールアドレスか検証することができるようになる。

  1. 必要なリソース、データモデルの作成
  2. mailer を使ったメール送信部分の作成
  3. アカウント有効化部分の実装

と進めていく。

Account activations resource

アカウント有効化は、メールに記載されたリンクをクリックするだけなので、updateアクションからの PATCH リクエストではなくeditアクションからの GET リクエストとして作成していく。

  • AccountActivations コントローラの作成
  • ルーティングにアカウント有効化用リソースを追加

と進める。

次にデータモデルの作成。

DB の内容が漏れた時の被害を最小に抑えるために、有効化トークンをハッシュ化して DB に保存するようにする。

  • ハッシュ化した有効化トークン
  • 有効化済みかどうかを表す boolean
  • ユーザーを有効にした日時

を User データモデルに追加する。

$ rails generate migration add_activation_to_users activation_digest:string activated:boolean activated_at:datetime
Running via Spring preloader in process 796096
      invoke  active_record
      create    db/migrate/20170426235417_add_activation_to_users.rb

activated(有効化済みかどうかを表す boolean) にデフォルト false を設定してマイグレーションを実行する。

次に、before_createコールバックを使ってユーザーオブジェクト作成時に有効化トークンや有効化ダイジェストを作成できるようにする。
また、確認やテストができるようにサンプルユーザーと fixture のユーザーは初めから有効にしておく。

Account activation emails

Action Mailerを使ってユーザー有効化リンク付きのメール送信を行う。

  • rails generate で User メイラーを自動生成
    • テキストメール、HTML メールそれぞれのテンプレートが生成される
    • User メイラーで作成したインスタンス変数はメイラービューで使用可能
  • 送信元メールアドレスを noreply に変更
  • user インスタンス変数を作成する
  • user.email にメール送信する
  • subject キーを引数として渡して件名をセットする
  • 名前付きルートでクエリパラメータを渡すと自動でエスケープしてくれる
    • コントローラで取り出すときには自動でエスケープ解除もしてくれる
  • @userインスタンス変数、editへの名前付きルートを使って有効化用リンクを作成する
  • メールの表示をプレビューで確認する
  • 送信メールのテスト
    • assert_match を使ってメール本文にユーザー名や有効化トークンが含まれていることを確認
  • Users create アクションを更新

と進む。
Cloud 9 を使用しているので Cloud IDE 用設定を使用した。

Activating the account

AccountActivations コントローラの edit アクションを実装していく。

  • メタプログラミング
    • 黒魔術
    • send を使った呼び出しメソッドの動的切り替え
  • セッション管理で使用する authinticated? を上記で書き換えて有効化用メソッドと共用
    • テストも合わせて修正する
  • 一度有効化したユーザーは再度有効化しないようにする
    • 有効化した後リダイレクトされたユーザーはログイン済み状態になる
    • この場合、有効化リンクが流出すると後からいくらでもログイン可能になってしまう
  • 有効化済みのユーザーのみログイン可能にする
    • 有効化済みでない場合は flash で warning を表示する
  • 統合テストを追加する

と進める。

Email in production

production 環境でメール送信ができる用設定を進める。

Heroku の SendGrid アドオンを使用する方法が紹介されている。

SendGrid - Add-ons - Heroku Elements

  • アドオン追加にはクレジットカード情報が必須
  • 月12000件までの送信は無料

Rails チュートリアルに記載のある上限数と異なっている(400 emails/day)が押し並べて同じ。(実際変わったってことなのかな)

暗号化されていないセキュリティ情報はソースコードに書き込まず環境変数に設定する。
ここまでやって本番環境にデプロイした後は、自分のメールアドレスを登録して有効化できることが確認できる。

その他

Rails 5.1 が出た。

Rails 5.1/ Loving JavaScript, System Tests, Encrypted Secrets, and more | Riding Rails

ちょうど今回扱ったメイラー周りに手が加えられている。
また、「暗号化されていないセキュリティ情報はソースコードに書き込まず環境変数に設定する」みたいな運用方法も見直される模様。

As per our maintenance policy, the release of Rails 5.1 means that bug fixes will only apply to 5.1.x, regular security issues to 5.1.x and 5.0.x, and severe security issues to 5.1.x, 5.0.x, and 4.2.x. This means 4.x and below will essentially be unsupported!

ということで、Rails 4 はサポート終了になるので 5 への移行を進めましょうということか。