3

我对运行集成测试以供用户登录时遇到的错误有点困惑。以下是跟踪的前几行:

invalid hash
    @ /home/benjamin/.rvm/gems/ruby-1.9.3-p194/gems/bcrypt-ruby-3.0.1/lib/bcrypt.rb:171:in `initialize'
      /home/benjamin/.rvm/gems/ruby-1.9.3-p194/gems/activemodel-3.2.6/lib/active_model/secure_password.rb:58:in `new'
      /home/benjamin/.rvm/gems/ruby-1.9.3-p194/gems/activemodel-3.2.6/lib/active_model/secure_password.rb:58:in `authenticate'
      /home/benjamin/projects/LTClone/app/controllers/sessions_controller.rb:9:in `create'

所以错误来自动作中的这一行create

if user && user.authenticate(params[:session][:password])

它调用中authenticate定义的方法secure_password.rb

def authenticate(unencrypted_password)
  if BCrypt::Password.new(password_digest) == unencrypted_password
    ...

它调用该BCrypt::Password.new方法,该方法定义在bcrypt.rb

def initialize(raw_hash)
  if valid_hash?(raw_hash)
    ...
  else
    raise Errors::InvalidHash.new("invalid hash")        # line 171
  end
end

因此,由于某种原因,raw_hash与 指定的正则表达式不匹配valid_hash?,这意味着该password_digest变量不是有效的哈希。根据这个答案,我试图验证的用户似乎是空白或无效的password_digest,但在我调用create测试中的操作之前,我可以puts @user.password_digest,并且打印了哈希(并且 Rubular 说valid_hash?正则表达式匹配它) . 我还将创建方法更改为

if user && user.password_digest && user.authenticate(params[:session][:password])

只是为了确保它真的存在。

所以现在我完全被难住了。似乎我有一个有效的password_digest,但BCrypt::Password.new拒绝承认它。有人知道为什么吗?

4

3 回答 3

2

检查您的用户“password_digest”列。如果它是“nil”,那么你会得到这个错误。建议是简单地删除所有用户并确保正确创建用户。

于 2013-06-04T11:40:12.843 回答
1

我不确定这是否对您来说是相同的解决方案,但我的问题(非常相同的错误)已通过更改存储在test/fixtures/users.yml文件中的夹具中的密码得到解决。一旦我保存并rails test再次运行,测试就通过了。

于 2017-01-15T01:51:28.120 回答
0

您可以执行 if/else 来查看 password 或 password_digest 是否为 nil

if user.password.nil?
  #redirect back to login with message
else

if user && user.authenticate(params[:session][:password])
  #do your stuff!
end
于 2015-03-02T16:28:27.570 回答