5

我有一个 API,我安装了下一个 gem

 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

谢谢 :)

4

2 回答 2

9

密码未保存为 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

于 2016-02-13T22:52:14.160 回答
9

不要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

于 2016-02-13T18:40:44.523 回答