ぞえの技術めも

Ruby on Rails勉強中

【128日目】【1日20分のRailsチュートリアル】【第10章】アカウント有効化の動作を確認する

Ruby on Railsチュートリアル(第3版)

今日は「10.1.3 アカウントを有効化する」のesitアクション書くところから。

10.1.3 アカウントを有効化する

authenticated?がリスト10.24のようになったことで、やっとeditアクションを書く準備ができました。

ようやく!

正当であろうとなかろうと、有効化が行われるとユーザーはログイン状態になります。
もしこのコードがなければ、攻撃者がユーザーの有効化リンクを後から盗みだしてクリックするだけで、本当のユーザーとしてログインできてしまいます。そうした攻撃を防ぐためにこのコードは非常に重要です。

有効化が行われてもログイン状態にしないのもありかな?と思ったけど、ユーザーがサービスに登録するときのこと考えるとユーザビリティを損なうよねぇ…。
(有効化してもログインは別に実施してね、ってサービスたまにあるけどめんどくさい)

有効化のチェック大事だな。

editアクションを下記の通り追加。

app/controllers/account_activations_controller.rb

class AccountActivationsController < ApplicationController

  def edit
    user = User.find_by(email: params[:email])
    if user && !user.activated? && user.authenticated?(:activation, params[:id])
      user.update_attribute(:activated,    true)
      user.update_attribute(:activated_at, Time.zone.now)
      log_in user
      flash[:success] = "Account activated!"
      redirect_to user
    else
      flash[:danger] = "Invalid activation link"
      redirect_to root_url
    end
  end
end

トークンが無効になるようなことは実際にはめったにありませんが、もしそうなった場合はルートURLにリダイレクトされる仕組みです。

よく有効化メールって有効期限あるけどそれは設けないのかな…??
すでにアカウント有効化したのに有効化リンクにアクセスするとトークンが無効として判断されるんだろうな。

リスト10.29のコードを使用すると、リスト10.23にあるURLを貼り付けてユーザーを有効化できます。

URL分かんなくなっちゃったや…。
再度ユーザー登録試してみるか。

サーバーを起動して

$ rails server -b $IP -p $PORT

サインアップ画面から自分のメールアドレス入力してユーザー登録。

……あれ、ログに出力されるアカウント有効化リンクが間違ってる…???アクセスしたらエラー画面表示された。

http://rails-tutorial-c9-mhartl.c9.io/account_activations/twAnDr7ZAiBz0KsdRZ-2cA/edit?email=<メールアドレス>

あ、メール設定のホスト名間違ってた。自分の環境に合わせないといけなかった。

↓このとき設定したやつ。

kt-zoe.hatenablog.com

ちゃんと自分の環境に合わせたホスト名に修正。

config/environments/development.rb

  host = 'rails-tutorial-kt-zoe.c9users.io/'

ホスト名修正できたらサーバーを起動し直して再度ユーザー登録。
(さっき登録しようとしたアカウントはデータベースいじってそっと消した)

ログに正しいアカウント有効化リンクが出力されるようになったので、出力された有効化リンクにアクセス。

f:id:kt_zoe:20170403123645p:plain

できたー!動いたー!

ユーザーの有効化が役に立つためには、ユーザーが有効である場合にのみログインできるようにログイン方法を変更する必要があります。

今はアカウント有効化してなくてもログインできるのでアカウント有効化が役に立つようにログイン方法を変更。

app/controllers/sessions_controller.rb

  def create
    @user = User.find_by(email: params[:session][:email].downcase)
    if @user && @user.authenticate(params[:session][:password])
      if @user.activated?
        log_in @user
        params[:session][:remember_me] == '1' ? remember(@user) : forget(@user)
        redirect_back_or @user
      else
        message  = "Account not activated. "
        message += "Check your email for the activation link."
        flash[:warning] = message
        redirect_to root_url
      end
    else
    :

userじゃなくて@userを使ってたのでチュートリアルの例からはちょっと修正。
うーん、これどっちも動くんだろうけどどっちが正しいのか…よく分からない。。。

アカウント有効化してないユーザーでログインを試みる。

f:id:kt_zoe:20170403123658p:plain

警告表示されました!

今日の学習時間は【45分】
キリのいいところまで進めておきたかったので結構長め。

次は「10.1.4 有効化のテストとリファクタリング」から。