気ままに気ままのエンジニアブログ

定期的に得た知見を気ままに発信中

【Rails】devise「メール認証機能」の仕組みについて

こんにちは。

やっと夏が来たと思いきやもう秋ですね。今日から栗開きです!

どうもハチマキです。

はじめに

今回新たにdevise機能を実装してみました。
deviseの実装方法の記事は色々あったため、今回はデータの流れからdeviseの仕組みを読み解いていきたいと思います。

もし実装方法が知りたいという方であれば、参考にさせて頂いた記事を載せておりますので、そちらを見ていただけたらと思います。

では早速行きましょう!

本日の概要 : メール認証機能「devise」の仕組み

事象

会員登録などでよく使われるメール認証機能(会員登録前にメール送信を行い、リンククリックによって本登録ができる)を実装したい!
そんな時に役立つのが、今回のdeviseです。

仕組み

deviseの実装を進めていくと、db:migrateを行い下記4つのカラムをDBに追加していきます。

  • confirmation_token
  • confirmed_at
  • confirmation_sent_at
  • unconfirmed_email

メール認証を実装する上では、追加したconfirmation_tokenカラムconfirmed_atカラムが肝になります。

consoleでデータの流れをみる(会員登録を想定し進めていきます)


deviseを実装し、登録フォームで登録を行うと、まず追加したカラムのconfirmation_tokenにパラメータが入ります。
これが言わば、仮会員登録の状態です。

$ rails c

[1] pry(main)> User.last
  User Load (0.8ms)  SELECT `users`.* FROM `users` ORDER BY `users`.`id` DESC LIMIT 1
=> #<User id: 1, email: test@gmail.com", confirmation_token: "test-hoge123450", confirmed_at: nil, confirmation_sent_at: "2020-09-05 01:42:40", unconfirmed_email: nil>


登録を行うことで、SMTPから登録したメールアドレスにメールが送信されます。
送信されたメールのリンクをクリックすることで、confirmation_tokenに入ったパラメータがnilになり、confirmed_atにリンクをクリックした日時が入ります。
これが、本会員登録(メール認証が完了)した状態になります。

[2] pry(main)> User.last
  User Load (0.8ms)  SELECT `users`.* FROM `users` ORDER BY `users`.`id` DESC LIMIT 1
=> #<User id: 1, email: test@gmail.com", confirmation_token: nil, confirmed_at: "2020-09-05 01:44:31", confirmation_sent_at: "2020-09-05 01:42:40", unconfirmed_email: nil>


よって、ブラウザではログインができる状態になります。

この一連のデータの流れがメール認証機能の仕組みです!結構シンプルでした。

カラムの補足
  • confirmation_sent_at: "2020-09-05 01:42:40"
    • 認証用メールが送られた日時のデータ
  • unconfirmed_email: nil
    • メールアドレスの変更時に使用。確認用メールを送信し、そのリンクを実行した場合に値が変更されます(※今回のメール認証では不要)