###editアクションで有効化
####アカウントを有効化するeditアクション
app/controllers/account_activations_controller.rb
class AccountActivationsController < ApplicationController
def edit
user = User.find_by(email: params[:email])
# paramsハッシュで渡されたメールアドレスに対応するユーザーを認証します
if user && !user.activated? && user.authenticated?(:activation, params[:id])
# 攻撃者がユーザーの有効化リンクを後から盗みだしてクリックするだけで、
# 本当のユーザーとしてログインできてしまいます。
user.update_attribute(:activated, true)
user.update_attribute(:activated_at, Time.zone.now)
# ユーザーを認証するには、ユーザーを認証してから
# activated_atタイムスタンプを更新する必要
log_in user
flash[:success] = "Account activated!"
redirect_to user
else
flash[:danger] = "Invalid activation link"
redirect_to root_url
# トークンが無効になるようなことは実際にはめったにありませんが、
# もしそうなった場合はルートURLにリダイレクトされる仕組み
end
end
end
####有効でないユーザーがログインすることのないようにする
app/controllers/sessions_controller.rb
class SessionsController < ApplicationController
.
.
.
def create
@user = User.find_by(email: params[:session][:email].downcase)
# 送信されたメアドを使ってデータベースから取り出す。
#emailを小文字にする
if @user &.authenticate(params[:session][:password])
# user 取得したユーザーが有効かどうか?
# その後にデータベース上にパスワードがあるか?
# ユーザーログイン後にユーザー情報のページにリダイレクトする
# &.は省略型
if user.activated?
# ユーザーが有効か?
log_in user
params[:session][:remember_me] == '1' ? remember(user) : forget(user)
# 1の場合はremmber(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
flash.now[:danger] = 'Invalid email/password combination'
# flash.nowでリクエストが発生後メッセージを消滅する
# エラーメッセージを作成する
render 'new'
# newアクションのビューを表示
end
end
.
.
.
end
###演習
1.
コンソールから、11.2.4で生成したメールに含まれているURLを調べてみてください。URL内のどこに有効化トークンが含まれているでしょうか?
https://*******5.vfs.cloud9.ap-northeast-1.amazonaws.com/account_activations/OGHN0ebW8H-S6dqER1u-bQ/edit?email=ghi%40jkl.com
有効かトークンOGHN0ebW8H-S6dqER1u-b
先ほど見つけたURLをブラウザに貼り付けて、そのユーザーの認証に成功し、有効化できることを確認してみましょう。また、有効化ステータスがtrueになっていることをコンソールから確認してみてください。
確認
有効化ステータスがtrueになっていることをコンソールから確認できなかった。