パスワードの安全な取り扱いを学ぼう
サービスには他人のアカウントに不正にログインされてします危険性がある。
それでは安全にするためにはどうすればいいのか?
安全性の高いパスワード
万が一パスワードを覗き見られたり、データが盗まれても、パスワードの内容がわからない状態
どのように安全にするか? ハッシュ化
ハッシュ化された特別な文字列。このようにハッシュ化することで安全性を高めることができる
Gemfileを編集しよう
Rails でパスワードをハッシュ化する際は、gemというツールを必要。
Gemとは
RubyやRailsでプログラミングをする際に「よく使う機能」をパッケージ化したもの
Railsにインストールすることで使用することができます。
今回はbcryptという「ハッシュ化するgem」を使います。
どうやってインストールするのか?
インストールしたいgemを記述するGemfileというファイルが存在します。
つまり
Gemfileにファイル名を記述することによってインストールできるのか?
gemファイルのインストールの方法
「gem 'gemの名前'」と記述します.
その後ターミナルで「bundle install」というコマンドを実行すると、書かれたgemをインストールすることができます。
Gemfile.lock
Gemfileの下にあるGemfile.lockというファイルは自動で作成されるファイルなので編集する必要はありません。
やってみた。
gem 'bcrypt'
bundle install
成功
has_secure_password
bcryptからどうやってハッシュ化をするのか?
ハッシュ化の手順
bcryptをインストールすると、has_secure_passwordというメソッドが使えるようになります。
has_secure_passwordメソッドをかく。
class User < ApplicationRecord
# has_secure_passwordメソッドを追加してください
has_secure_password
.
.
.
end
passwordカラムのバリデーションを削除をしても問題にならない。
password_digestカラムを追加しよう
has_secure_passwordメソッドはハッシュ化したパスワードをpassword_digestカラムに保存することになっている。
安全を考慮して書かない。
一つのマイグレーションファイルに複数のカラムを設定
マイグレーションファイルを作成
rails g migrationコマンドを用いる。
passwordカラムが削除されるよう、左の図のようにマイグレーションファイルを編集しましょう。
マイグレーションファイルのカラムの削除
カラムを削除する場合は、add_columnの代わりにremove_columnを用います。
思ったこと
なんでパスワードカラムを削除してパスワードダイジェストカラムを追加する必要があるのか?
ハッシュ化したパスワードをパスワードカラムに入れろばいいじゃないか。
マイグレーションファイルを作成
rails g migration change_users_columns
class ChangeUsersColumns < ActiveRecord::Migration[5.0]
def change
add_column users :password_digest :stirng
end
end
こうだったかな?
class ChangeUsersColumns < ActiveRecord::Migration[5.0]
def change
add_column :users, :password_digest, :stirng
remove_column :users, :password, :string
end
end
全てシンボルにすることと,で区切ることだったか。
tweet_app $ rails db:migrate
マイグレーションファイルを正しく編集してから実行してください。
add_column :users, :password_digest, :stirng
add_column :users, :password_digest, :string
stringの綴り間違いだった。
ちょっと休憩。