0

ユーザーのパスワードを安全に保存するために、Sinatra/Ruby アプリケーションで BCrypt を使用しようとしています。

次のコードは、私の User モデルです。

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: "bar@foo.com")
    user.password = "admin"
    user.save
end

認証メソッドを so: のように呼び出すとUser.authenticate("bar@foo.com", "admin")、コードは false を返します。ユーザーが存在することは確かです。

編集: u.password == requested_password false も返します

メソッドに渡される値が有効で正しい場合でも、なぜこのようなことが起こるのでしょうか?

4

1 に答える 1

0

secret というキーを作成し、password と password_hash を削除します。

コードを次のように変更します。

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

def password
  return BCrypt::Password.new(secret) if self.secret
  nil
end
于 2015-04-10T20:51:56.210 に答える