この記事について…
普段はRuby on Railsと無縁なプログラマなんですが、今更ながら面白そうという単純な理由からRuby on Rails Tutorialをやってみようと思い立ちました。今回は前回の記事の続きで第9章をやっていきます。
尚、Rails 5.1に対応した第4版を用いて、かつHyper-V上にインストールしたUbuntu 18.04の環境で進めていきます。
第9章 発展的なログイン機構
この章では第8章のログイン機構を発展させて、ログイン情報をブラウザのcookiesに記憶することで「ブラウザ再起動後でもすぐにログインできる機能(remember me)」を追加します。
今回のログイン機構の仕組みは、第6章で扱ったパスワード認証処理と似ていて、
「データベースに保存したダイジェスト(ハッシュ値)と、cookiesに保存した値から計算したダイジェストが一致するかどうか」
を確認することで自動ログインするかどうか判断しています。
パスワード認証処理では
「データベースに保存したダイジェスト(ハッシュ値)と、ユーザーがエディットコントロールに入力した値から計算したダイジェストが一致するかどうか」
でしたね。
ただ、パスワード認証処理ではRailsのメソッドであるhas_secure_password
を呼び出すだけで面倒な記述をすることなく実装が完了していました。
今回は自身でコードを書く必要がありますが、has_secure_password
の内部で何をやっているのか理解するのにとても良いと思います。
少し理解に時間が掛かったのは、「渡されたトークンがユーザーの記憶ダイジェストと一致することを確認します。」の部分。
secure_passwordのソースコードに
BCrypt::Password.new(password_digest) == unencrypted_password
という箇所があるというのですが、2019/03/29現在そのような箇所はないような…?
少し追っかけてみると、2012年4月のコミットffa974d
の時点ではTutorialの通りの箇所がありました。
しかし、2014年12月のコミットa928928
で
BCrypt::Password.new(password_digest).is_password?(unencrypted_password)
と修正されたようです。==演算子が再定義されている為 結局は同じなのですが、修正後の方が一目見て理解しやすい記述になっているなーと個人的には思います。
Railsに限りませんが、ソースコードがGitHub等で公開されている場合は参考にするのもいいなと感じます。勉強にもなりますしね。
それでは、次回 第10章から再開したいと思います。