プログラミングの勉強日記
2020年7月25日 Progate Lv.223
Ruby on RailsⅩⅠ
概要
今まで作成したアプリはパスワードが普通の文字列として保存されている。これだと、PCの覗き見やハッキングされデータが盗まれた場合にそのパスワードを使って簡単に他人のアカウントに不正ログインできる。
→安全性の高いパスワードは万が一覗き見やデータが盗まれてもパスワードの内容がわからない状態である。パスワードを複雑な文字列(暗号化された特殊な文字列)にすることで安全性を高められる。
Gemfileの編集
Railsでパスワードを暗号化するときはgem(読み方:「ジェム」)というツールを利用する。gemはRubyやRailsでプログラミングをするときに「よく使う機能」をパッケージ化したものである。様々なgemが存在するが、今回はbcryptという暗号化するためのgemを使う。
Railsにはインストールしたいgemを記述するGemfileというファイルが存在する。gem 'gemの名前' と記述する。rails newコマンドで生成されたGemfileにはすでにいくつかのgemが書かれてインストールされている。
gem 'gemの名前', 'gemのバージョン' とすると、そのバージョンがインストールされる。バージョンを指定しないと、最新のgemがインストールされる。
gem 'rails', '5.0.3'
gem 'puma', '3.6.2'
bcryptのインストール
gem 'bcrypt'
$ bundle install
暗号化する
- bcryptをインストールすると
has_secure_passwordというメソッドが使えるようになる。パスワードを扱うUserモデルにhas_secure_passwordを追加する。これでユーザを保存するときに自動的にパスワードを暗号化する。
class User < ApplicationRecord
has_secure_password
end
has_secure_passwordはpasswordが存在するか自動的にチェックする。
-
passwor_digestカラムを追加する。has_secure_passwordメソッドは暗号化したパスワードをpasswor_digestカラムに保存する。rails generate migrationコマンドでマイグレーションファイルを作成し、passwor_digestカラムが追加されるように編集する。次にpasswordカラムが削除されるように編集する。カラムの削除はremove_columnを使う。1つのマイグレーションファイルで複数のカラムを変更できる。
$ rails generate migration change_users_columns
マイグレーションファイル変更後
$ rails db:migrate
class ChangeUsersColumns < ActiveRecord::Migration[5.0]
def change
add_column :users, :password_digest, :string
remove_column :users, :password, :string
end
end
-
password_digestカラムに暗号化されたパスワードを保持するためには今まで通りpasswordに値を代入する。これで、has_secure_passwordによってpasswordに代入された値が暗号化され、password_digestカラムに保存される。なので、すでにあるpasswordに関するコードは変更しなくていい。
暗号化されたパスワードでのログイン
フォームに入力されたメールアドレスに一致するユーザを取得し、フォームに入力されたパスワードと取得したユーザのパスワードが一致するかを判定する。has_secure_passwordメソッドを有効にするとauthenticateメソッドを使えるようになる。authenticateは渡された引数を暗号化し、password_digestの値と一致するかどうかを判定する。authenticateメソッドを使って、「送信されたメールアドレスと一致するユーザ」のpassword_digestと送信されたパスワードが一致するかどうかでログイン処理をする。
def login
@user = User.find_by(email: params[:email])
if @user && @user.authenticate(params[:password])