Rails 6.0 でアプリを開発 基本の流れ④ セキュアなパスワード
今回はUser認証を行うセキュアなパスワードを設定するためのメモ。
ハッシュ化
セキュリティのために生のパスワードをDBに保存しないことが大事
ハッシュ関数を使って入力されたデータをもとに戻せない(不可逆な)データにする処理を行う。
ユーザー認証(authenticate)
この辺、少し言葉がごちゃごちゃする。上記のハッシュ化をユーザー認証(authenticate)するのに使う。その流れは、
①パスワードの送信
②パスワードのハッシュ化
③DB内のハッシュ化された値との比較
④一致すればユーザー認証(authenticate)
手順
1.マイグレーションファイルの作成
ハッシュ化したパスワードを保存するためのpassword_digest属性を作成
$ rails g migration add_password_digest_to_users password_digest:string
$ rails db:migrate
2.gem bycriptを追加
bycriptはhas_secure_passwordを使用するためのgem
※6.0でもgemファイルの中に#化されているので復活させる
3.セキュアなパスワードの実装
これにより
①ハッシュ化したパスワードをDB内に先ほど作成したのpassword_digestに保存する。
※digestとは暗号化用ハッシュ関数という語源らしい
②2つの仮想的な属性(passwordとpassword_confirmation)が使える
③存在性と値が一致するかどうかのバリデーションも追加される
④authenticateメソッドが使えるようになる
※authenticateメソッドとは引数の文字列がパスワードと一致するとそのオブジェクトを返し、間違っているとfalseを返すメソッド
4.テスト
上記3の③でhas_secure_passwordを設置したために強制的に追加されたバリデーションを通すためにtestのsetupメソッド内に上記3の②で使えるようになったpasswordとpassword_confirmationを追加する
これによりテストが成功する
5.パスワードの存在性と最小文字を設定
①テストでブランクを不可とするか存在性を確かめる
②テストで最小文字数にあたらないかを確かめる
③上記に沿ってuser.rbにバリデーションを設定する
これでこのテストも通る
6.authenticateメソッドが使えるようになっているか確認
上記3の④のauthenticateメソッドが使えるようになっているかチェック
①rails consoleに入る
②user = User.create(name: "hoge", email: "hoge@hoge.com", password: "hogehoge", password_confirmation: "hogehoge")
③user.password_digest
④user.authenticate("hogehoge") ←正しいパスワード
※パスワードとか違うものを使っているが正しくかえってきているので認証成功!
補足.演習について
ちなみにrails tutorialの演習6-3-4-3の方法が気になったのでついでに
セキュアなパスワードを設定した際にこのソールで名前のみ変更する方法
user.update_attribute(:name, "hogetaro")
※attributesではなく、attributeであることに注意
update_attribute: 1つの属性のみを更新・保存するメソッド
update_attirbutes: 複数の属性をまとめて更新・保存するメソッド
参考にさせていただいたサイト
第6章 ユーザーのモデルを作成する - Railsチュートリアル
【Rails入門】update_attributesで更新する方法をわかりやすく解説 | 侍エンジニア塾ブログ(Samurai Blog) - プログラミング入門者向けサイト
※↑↑これがかなりまとめられている!