ユーザー登録/ログアウト/ログイン動作確認(2)
続いてRecoverableモジュールによるパスワードリセット機能も有効になっていることを確認します。ログイン画面の[Forgot your password?]リンクをクリックすると以下のようにEmailを入力するフォームが表示されます。
ユーザー登録時に使用したEmail(test@test.com)を入力し[Send me reset password instructions]ボタンをクリックするとログインページ(/users/sign_in)に遷移し、「You will receive an email with instructions on how to reset your password in a few minutes.」とflashメッセージが表示されます。
アプリケーションログにメール送信処理が出力されているので、rails sで起動したコンソールを確認するか、log/development.logファイルを確認します。以下のように出力されます。
Devise::Mailer#reset_password_instructions: processed outbound mail in 242.9ms Sent mail to test@test.com (11.4ms) …(中略)… <p>Hello test@test.com!</p> <p>Someone has requested a link to change your password. You can do this through the link below.</p> <p><a href="http://localhost:3000/users/password/edit?reset_password_token=mH3xZbupQK7ev4whLjwf">Change my password</a></p> <p>If you didn't request this, please ignore this email.</p> <p>Your password won't change until you access the link above and create a new one.</p>
[Change my password]リンクのタグに指定されているURL(ここでは「http://localhost:3000/users/password/edit?reset_password_token=mH3xZbupQK7ev4whLjwf」)にアクセスすると、以下のようにパスワード変更ページが表示されます。
新しいパスワードを正しく入力して[Change my password]ボタンをクリックすると、ログインしてトップページに遷移し、「Your password has been changed successfully. You are now signed in.」とflashメッセージが表示されます。
なお、ログイン時の情報を保存するTrackableモジュールが有効になっていることは、データベースにアクセスしてユーザー情報を表示すると、sign_in_count等のカラムにデータが格納されていることから分かります。
bin/rails dbconsole
psql (10.3)
Type "help" for help.
devise_sample_development=# select sign_in_count, current_sign_in_at, last_sign_in_at, current_sign_in_ip, last_sign_in_ip
devise_sample_development-# from users where email = 'test@test.com';
sign_in_count | current_sign_in_at | last_sign_in_at | current_sign_in_ip | last_sign_in_ip
---------------+----------------------------+----------------------------+--------------------+-----------------
4 | 2018-04-23 07:39:32.041131 | 2018-04-23 07:35:46.022133 | 127.0.0.1 | 127.0.0.1
(1 row)
まとめ
ここまで、deviseにおける基本的な機能の概要を確認するとともに、実際にdeviseをRailsアプリにインストールしてデフォルトの機能を中心に実装と動作確認を行いました。Railsチュートリアルなどの実装と異なり、ほとんどプロダクトのコードを記述することなくユーザー認証機能を追加できます。
さらに、deviseの動作を確認することで、Rails enginesの強力な機能を体感することができます。一方でdeviseはRailsと密結合とも言われ、デフォルトの動作をカスタマイズしようとするとハマりどころも少なくないので注意が必要です。
よりシンプルでRailsと疎結合なsorceryというgemもありますが、素早くユーザー認証機能をRailsで実装するにはdeviseが一番手軽と言えます。
次回は、SNS認証で定番gemであるOmniauthを紹介する予定です。deviseとの連携してSNS認証機能を実装していきます。
