2014-10-22 5 views
0

Чтобы безопасно хранить пароли моего пользователя, я пытаюсь использовать BCrypt в своем приложении Sinatra/Ruby.Сравнение паролей Ruby BCrypt возвращает неверную оценку

Следующий код моей модели пользователя.

require 'mongo_mapper' 
require 'bcrypt' 

# User model 
class User 
    include MongoMapper::Document 
    include BCrypt 

    key  :email,   String,   length: 6..50,  unique: true 
    key  :password,  String 
    key  :password_hash, String 

    def password 
     @password ||= Password.new(password_hash) 
    end 

    def password=(new_password) 
     @password = Password.create(new_password) 
     self.password_hash = @password 
    end 

    def self.authenticate(requested_email, requested_password) 
     u = self.find_by_email(requested_email) 
     u if u && u.password_hash == requested_password 
    end 
end 

# Test user account 
if User.count == 0 
    user = User.new(email: "[email protected]") 
    user.password = "admin" 
    user.save 
end 

Когда я вызываю метод Аутентифицировать так: User.authenticate("[email protected]", "admin"), код возвращает ложь. Я уверен, что пользователь существует.

EDIT: u.password == requested_password возвращает ложь, а

Почему это происходит, даже когда значение передается метода являются действительными и правильными?

ответ

0

создать секретный ключ, удалить пароль и пароль_hash.

Изменить код:

def password=(password) 
    self.secret = BCrypt::Password.create(password) 
end 

def password 
    return BCrypt::Password.new(secret) if self.secret 
    nil 
end 
Смежные вопросы