初めに
Railsでbcryptを使えばパスワードの暗号化やユーザー登録時のpassword_confirmationを簡単に実装できる。
けど暗号化とかかっこいいので自分でもやってみたいということでbcryptを使わないでパスワードの暗号化をしたい。
とりあえず
rails new secure
rails g model user name:string mail:string password:string
rails g controller users index show edit new
して準備完了
普通に登録しログインできるようにする
class UsersController < ApplicationController
def index
@users = User.all
end
def show
@user = User.find params[:id]
end
def new
@user = User.new
end
def create
@user = User.create(user_params)
if @user.save
redirect_to users_path
else
render :new
end
end
def edit
@user = User.find params[:id]
end
def update
if User.update(user_params)
redirect_to users_path
else
render :edit
end
end
private
def user_params
params.require(:user).permit(:name,:mail,:password)
end
end
あとはviewを適当に書けばOK
とりあえずcryptをつかってみる
irb(main):001:0> str = "hello world"
=> "hello world"
irb(main):002:0> p str.crypt("asdf")
"asodDSQaBIZi."
=> "asodDSQaBIZi."
といった感じでstr.crypt(salt)という構文で暗号化ができる。
このsaltの値をどうしようかと思うのですがとりあえず"secretkey"ってことにしときます。
users_helper.rbに
module UsersHelper
def secure_pass(password)
secure_password = password.crypt("secretkey")
return secure_password
end
end
こう書いて
users_controller.rbのcreateを
def create
password = user_params[:password]
@user = User.create(user_params.merge(password: secure_pass(password)))
if @user.save
redirect_to users_path
else
render :new
end
end
みたいにすれば登録されるパスワードは暗号化されてる
次にログイン機能で
とりあえずsessions_controllerを作って
class SessionsController < ApplicationController
include UsersHelper
def new
end
def create
user = User.find_by(mail: params[:mail])
if user.password == secure_pass(params[:password])
session[:user_id] = user.id
redirect_to users_path
else
render :new
end
end
end
こんな感じにした
これでログインできるし登録されるパスワードの値はse64GVO8lvmmUみたいな感じで暗号化されてます。
あとはsaltの部分、今回はsecretkeyとしているところをどうしたらいいか
追記
secretkeyをconfig/credentials.yml.encに保存しようとしたがうまくいかなくて困ってましたがWSLを使えばできるとアドバイスをもらいまして...
WSLを使って設定できるようになりました。(環境変数PATHが変なことなってて結構つまづいた…)
ということでwindowsにインストールしたubuntu上で
EDITOR="vi" rails credentials:edit
を行ってそこに
salt:
salt_key: secretkey
みたいな感じで設定した
このsalt_keyの使い方は
Rails.application.credentials.salt[:salt_key]
みたいな感じで呼び出すことができます。
これを使ってusers_helper.rbに
module UsersHelper
def secure_pass(password)
secure_password = password.crypt(Rails.application.credentials.salt[:salt_key])
return secure_password
end
end
こんな感じで書いて使うことができます
教えてくださった方ありがとうございました。
ちなみに
Bcryptを使うとgem install bcryptして
models/user.rbに
class User < ApplicationRecord
has_secure_password
end
とかけばおわりとすごく簡単だしpassword_confirmationも実装してくれる