Как зашифровать пароль с помощью has_secure_password в Rails 4.2

У меня есть API, и я установил следующий драгоценный камень

 gem 'bcrypt' 

И в моей модели пользователя я определил, что:

has_secure_password

Моя база данных Есть поле с именем

password_digest

А при запуске сеялок да пароль зашифрован, но при попытке создать нового пользователя из моего метода пароль нормальный, это мой метод создания нового пользователя

def self.from_auth(data)
    User.where(email: data[:email]).first_or_create do |user|
        user.email = data[:info][:email]
        user.name = data[:info][:name]
        user.provider = data[:info][:provider]
        user.uid = data[:info][:uid]
        user.password_digest = data[:info][:password]
    end
end

Спасибо:)

2 ответа

Решение

Не пишите password_digest приписывать напрямую. использование password (и, вероятно, password_confirmation) а Rails сделает магию за вас.

+ Изменить

user.password_digest = data[:info][:password]

в

user.password              = data[:info][:password]
user.password_confirmation = data[:info][:password]

Советую почитать документы дляhas_secure_password,

Вы не сохраняете пароль как хеш bcrypt.

Из документации bycrypt

https://github.com/codahale/bcrypt-ruby

require 'bcrypt'

my_password = BCrypt::Password.create("my password")#=> "$2a$10$vI8aWBnW3fID.ZQ4/zo1G.q1lRps.9cGLcZEiGDMVr5yUP1KUOYTa"

my_password.version              #=> "2a"
my_password.cost                 #=> 10
my_password == "my password"     #=> true
my_password == "not my password" #=> false

my_password = BCrypt::Password.new("$2a$10$vI8aWBnW3fID.ZQ4/zo1G.q1lRps.9cGLcZEiGDMVr5yUP1KUOYTa")
my_password == "my password"     #=> true
my_password == "not my password" #=> false

Таким образом, ваш код для хранения хеша пароля вашего пользователя будет выглядеть так

def self.from_auth(data)
  User.where(email: data[:email]).first_or_create do |user|
    user.email = data[:info][:email]
    user.name = data[:info][:name]
    user.provider = data[:info][:provider]
    user.uid = data[:info][:uid]
    user.password_digest = BCrypt::Password.create(data[:info][:password])
  end
end

Затем вы можете протестировать его, как написано в документации http://api.rubyonrails.org/classes/ActiveModel/SecurePassword/ClassMethods.html

Другие вопросы по тегам