【128日目】【1日20分のRailsチュートリアル】【第10章】アカウント有効化の動作を確認する
今日は「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=<メールアドレス>
あ、メール設定のホスト名間違ってた。自分の環境に合わせないといけなかった。
↓このとき設定したやつ。
ちゃんと自分の環境に合わせたホスト名に修正。
config/environments/development.rb
host = 'rails-tutorial-kt-zoe.c9users.io/'
ホスト名修正できたらサーバーを起動し直して再度ユーザー登録。
(さっき登録しようとしたアカウントはデータベースいじってそっと消した)
ログに正しいアカウント有効化リンクが出力されるようになったので、出力された有効化リンクにアクセス。
できたー!動いたー!
ユーザーの有効化が役に立つためには、ユーザーが有効である場合にのみログインできるようにログイン方法を変更する必要があります。
今はアカウント有効化してなくてもログインできるのでアカウント有効化が役に立つようにログイン方法を変更。
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
を使ってたのでチュートリアルの例からはちょっと修正。
うーん、これどっちも動くんだろうけどどっちが正しいのか…よく分からない。。。
アカウント有効化してないユーザーでログインを試みる。
警告表示されました!
今日の学習時間は【45分】。
キリのいいところまで進めておきたかったので結構長め。
次は「10.1.4 有効化のテストとリファクタリング」から。