バージョン
- rails: ver 6.0.1
- ruby: 2.6.5
- テスト: rspec
はじめに
-
ActionMailer
を使ってメール認証を実装しました。
やりたいこと
この一連の流れを実装していきます
実装
メールを設定する
設定の部分はこの記事を参考にさせていただきました。本記事ではActionMailerにどのようにメール認証機能を持たせたか書きます。
rails g mailer NotificationMailer
でメーラーを作成します
ここにメールの送り先や、メールの件名を指定します
class AuthenticateMailer < ApplicationMailer
def send_authenticate_mail(user)
@user = user
# メールを誰に送るか、メールの件名を設定
mail to: user.email, subject: '[dot] メール認証'
end
end
メーラーの名前.html.haml
にメールの本文を記述します
ここではauthenticate_mail.html.haml
%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
を書くことによってユーザーにトークンを持たせることができる
class User < ApplicationRecord
...
has_secure_token :auth_token
...
end
メールに認証機能をつける
ここからがメールに認証機能を持たせるための処理になります
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分考えてわからなければ質問してください!)
※上から下までコピペしてできるものではありません。私の作ったサービス独特なものがあるのでカスタマイズしていただく必要があります。
間違っている点や、抜けがある、もっといいやり方があるなどもおしゃってください!