今回、railsでパスワードを暗号化してDBに保存する方法とhas_secure_passwordメソッドの確認をしていきます。約一年ほど海外インターンのためPythonを中心に扱っていましたが、帰国後はrails中心の開発になりそうなので、学習を再開しました。今までモノシリックなアプリケーション開発を中心にrailsを扱ってきており、apiモードを使ったことないのでまずはrailsとnuxtでJWT認証の実装を試していきたいと思います。最終的にはパスワードレスなJWT認証を実装したいと思います。その第一歩としてこの記事を書きます。今回の項目は以下の通りです!
railsでパスワード暗号化を確認するまでの手順
- bcryptというgemをインストールする
- User用のコントローラとモデル作成
- Userモデルファイルにhas_secure_passwordを記述
- Consoleでパスワードが暗号化できているか確認
環境
ruby '2.6.3'
rails ' 6.0.2'
bcrypt 3.1.7
bcryptをインストール
まずはパスワードの暗号化に必要なbcryptをインストールします。gemファイルにbcryptを実行してrails bundle installで実行します。
# Use Active Model has_secure_password
gem 'bcrypt', '~> 3.1.7'
User用のコントローラとモデル作成
続いてUser コントローラーとモデルを作成していきます。今回は、パスワードの暗号化の仕方のみを確認したいので、シンプルにemailとパスワードのみ扱います。
rails g controller Users new
rails g model User email:string password_digest:string
モデルを作成する際の注意点としてパスワードのカラムはpassword_digestにしてあげます。カラム名をpasswordにすると後ほど使うhas_secure_passwordが機能せず、データベース内で暗号化できないので注意してください。作成されたマイグレーションファイルは以下です。確認できたらrails db:migrateを実行。
class CreateUsers < ActiveRecord::Migration[6.0]
def change
create_table :users do |t|
t.string :email
t.string :password_digest
t.timestamps
end
end
end
DBスキーマはこのような感じ。
schema.rb
create_table "users", force: :cascade do |t|
t.string "email"
t.string "password_digest"
end
Userモデルファイルにhas_secure_passwordを記述
続いて先ほど作成されたモデルファイルのuser.rbにhas_secure_passwordを記述します
class User < ApplicationRecord
has_secure_password
end
has_secure_passwordの機能
- パスワードを暗号化してDBに保存してくれる
- 仮想属性password_confirmationを使用して、パスワードの確認入力してくれる
- authenticateメソッドを使用して、ユーザー認証ができる。
Consoleでパスワードが暗号化できているか確認
user = User.new(email: “test@gmail.com”,password: “password”) でuser.saveしてあげるとpassword_digestに暗号化されてパスワードが保存されることが確認できます。
app$ back rails c
irb(main):007:0> user = User.new(email: "test@gmail.com",password: "password")
=> #<User id: nil, email: "test@gmail.com", password_digest: [FILTERED], created_at: nil, updated_at: nil>
irb(main):008:0> user.save
(0.6ms) BEGIN
User Create (0.9ms) INSERT INTO "users" ("email", "password_digest", "created_at", "updated_at")
VALUES ($1, $2, $3, $4) RETURNING "id"
[["email", "test@gmail.com"], ["password_digest", "$2a$12$8oAXXNrH5uO3HKZbzettBeGAfsD90T8nMEn2.ZG6Arc4QEvFnp05K"], ["created_at", "2020-04-28 08:06:30.399030"], ["updated_at", "2020-04-28 08:06:30.399030"]]
(1.3ms) COMM
以上、railsでパスワード暗号化を確認するまでの手順でした。約一年ぶりのrails newでしたが、少し感覚を取り戻してきたような気がします。次回はrails側でJWT認証の実装記事を書いていきたいと思います。
参考記事https://railstutorial.jp/chapters/modeling-users?version=4.0#sec-an_encrypted_password https://qiita.com/ryosuketter/items/805452b7e6bf9637cb57