0
0

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 5 years have passed since last update.

今更ながら Ruby on Rails Tutorial をやってみた (その9)

Posted at

この記事について…

普段は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のソースコード

rails/activemodel/lib/active_model/secure_password.rb
BCrypt::Password.new(password_digest) == unencrypted_password

という箇所があるというのですが、2019/03/29現在そのような箇所はないような…?

少し追っかけてみると、2012年4月のコミットffa974dの時点ではTutorialの通りの箇所がありました。
しかし、2014年12月のコミットa928928

rails/activemodel/lib/active_model/secure_password.rb
BCrypt::Password.new(password_digest).is_password?(unencrypted_password)

と修正されたようです。==演算子が再定義されている為 結局は同じなのですが、修正後の方が一目見て理解しやすい記述になっているなーと個人的には思います。

Railsに限りませんが、ソースコードがGitHub等で公開されている場合は参考にするのもいいなと感じます。勉強にもなりますしね。

それでは、次回 第10章から再開したいと思います。

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

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?