RailsのDBにパスワードを暗号化して保存する(has_secure_passwordの確認)

今回、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

>文系エンジニア大学生の技術ブログ

文系エンジニア大学生の技術ブログ

社会が多様化していく中、大学生の学生生活も多様であるべきと考えています。主にエンジニア向けにITやプログラミングなどの技術系と大学生向けに休学、留学、海外生活、トビタテ留学、長期インターンに関する記事を書いています。