📧
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