0
1

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.

ActionMailerでメール認証を実装した

Last updated at Posted at 2020-03-23

バージョン

  • rails: ver 6.0.1
  • ruby: 2.6.5
  • テスト: rspec

はじめに

  1. ActionMailerを使ってメール認証を実装しました。

やりたいこと

  1. メール認証のリンクをクリックするimage.png

  2. メール送信完了画面(&メールが届く)image.png

  3. メールのリンクをクリックするimage.png

  4. メール認証完了image.png

この一連の流れを実装していきます

実装

メールを設定する

設定の部分はこの記事を参考にさせていただきました。本記事ではActionMailerにどのようにメール認証機能を持たせたか書きます。

rails g mailer NotificationMailer

でメーラーを作成します
ここにメールの送り先や、メールの件名を指定します

app/mailers/authenticate_mailer.rb
class AuthenticateMailer < ApplicationMailer
  def send_authenticate_mail(user)
    @user = user
    # メールを誰に送るか、メールの件名を設定
    mail to: user.email, subject: '[dot] メール認証'
  end
end

メーラーの名前.html.hamlにメールの本文を記述します
ここではauthenticate_mail.html.haml

app/views/authenticate_mail..htmlhaml
%p #{@user.name_sei}%p 以下のリンクをクリックしてメール認証を完了させてください。
-# トークンを含んだメールURL
%p= link_to 'メール認証完了する', authenticate_completed_url(@user.auth_token)

トークンを作成するためのカラムを作る

参考: Railsでトークン認証のログインAPI実装
ユーザーにトークンを持たせるためにカラムを追加してください

rails g migration add_token_to_users token:token

rails db:migrate

ユーザーモデルにhas_secure_passwordを書くことによってユーザーにトークンを持たせることができる

user.rb
class User < ApplicationRecord
  ...
  has_secure_token :auth_token
  ...
end

メールに認証機能をつける

ここからがメールに認証機能を持たせるための処理になります

app/controllers/authentications_controller.rb
class User::AuthenticationsController < User::ApplicationController
  # ログインしていないユーザーのアクセスを許可するかどうかはauthenticate_user!を使用してください
  # authenticate_user!はdeviseに標準で搭載されているので定義する必要はありません
  skip_before_action :authenticate_user!, only: [:authenticate_completed]

  # メールを送信しました
  def authenticate
    user = current_user
    # メールを送信するための処理
    AuthenticateMailer.send_authenticate_mail(user).deliver
  end

  # メール認証を完了しました
  def authenticate_completed
    # 認証メールのリンクからトークンを取得してそのトークンを持つユーザーを探す
    user = User.find_by(auth_token: params[:auth_token])
    if user
      # トークンを再生成する、古いトークンを新しく書き換える
      user.regenerate_auth_token
      # is_confirmed_atに日付がいれて認証が完了していることを表す。済んでいなければnil
      user.is_confirmed_at = Time.current
      user.save!
    else
      redirect_to root_path
    end
  end
end

適宜viewを作成してください
authenticate.html.haml,authenticate_completed

AuthenticateMailer.メーラーで作成したメソッドの名前(user).deliver
ここではAuthenticateMailer.send_authenticate_mail(user).deliver
で画面を表示すると同時にサーバーからメールを送信しています。

最後に

どんな簡単な質問でも大歓迎です!
(15分考えてわからなければ質問してください!)
※上から下までコピペしてできるものではありません。私の作ったサービス独特なものがあるのでカスタマイズしていただく必要があります。

間違っている点や、抜けがある、もっといいやり方があるなどもおしゃってください!

0
1
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
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?