📧

Railsで新規ユーザーメール認証の実装

に公開

Rails8とMailgunAPIを使って実装しました。

そもそも認証をせずにログインさせたらどうなるのか?

常時クロールしているスパムが来て登録され、自分のサイトに悪質な情報やリンクなどを貼られる。

僕はユーザー認証をせずにドメインを取得してインターネット上にあげていました。その結果、ランダムなアルファベットのuserが存在していたので、早く対処をするために今回の機能を実装しようと決めました。

流れ

  • userが新規登録をする。
  • user情報をDBに格納
  • 他に、user.confirmation_tokenもランダムなアルファベットと数字で生成しておき、DBに格納する。user認証ができたか判断するvalidatedもfalseで登録しておく。
  • userが新規登録したら、mailgunによって確認メールが送られる。
  • メール内に"/login?confirmation_token="hogehoge""を記述しておく。
  • userがメールを開きそのリンクをクリックしたら、DBに保存しておいたconfirmation_tokenと照らし合わせて合っていたらvalidated=trueにする。
  • validated=trueだったら、ログインのアクションを可能にする。falseだったらログインさせない。
  • userがログイン

実装

userテーブル
  create_table "users", force: :cascade do |t|
  #省略
    t.string "confirmation_token"
    t.datetime "confirmed_at"
    t.boolean "validated", default: false
  end

メール認証

users_controller
  def pre_signup
    @user = User.find_by(confirmation_token: params[:confirmation_token])

    if params[:confirmation_token].present?
      if @user.confirmation_token == params[:confirmation_token]

        @user.validated = true;
        @user.save(validate: false)#user_paramsを全てチェックせずに、強制的に保存する。
        flash[:success] = "#{@user.name}さん、ユーザー認証が成功しました!🎉ログインして下さい。"
        redirect_to login_path
        
      else
        puts "👷‍♂️ Token: #{@user.confirmation_token}"
        flash[:danger] = '認証に失敗しました。もう一度ユーザーを登録してみてください。'
        redirect_to signup_path
      end
    end

  end

Discussion