0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

railsチュートリアル第11章 editアクションで有効化

Posted at

###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になっていることをコンソールから確認できなかった。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?