Rails:“BCrypt::Errors::InvalidHash"尝试登录时 [英] Rails: "BCrypt::Errors::InvalidHash" when trying to sign in
问题描述
我正在尝试完成一个项目.我正在使用用户模型.当我注册时一切正常.但是当我尝试登录同一个成员时,我收到此错误.
I am trying to finish a project. I am working with user models. When I signup everything seems ok . But when I try to signin the same member I get this error.
我们很抱歉,但出了点问题.heroku 日志 文件显示错误为:
We're sorry, but something went wrong. heroku logs file shows error as:
BCrypt::Errors::InvalidHash (invalid hash):
app/controllers/sessions_controller.rb:8:in `create'
我的*sessions_controller*是:
class SessionsController < ApplicationController
def new
end
def create
user = User.find_by_email(params[:session][:email])
if user && user.authenticate(params[:session][:password])
sign_in user
redirect_to user
else
flash.now[:error] = 'Invalid email/password combination'
render 'new'
end
end
def destroy
sign_out
redirect_to root_path
end
end
和用户模型是:
class User < ActiveRecord::Base
attr_accessible :email, :name, :nickname,:password, :password_confirmation
has_secure_password
before_save { |user| user.email = email.downcase }
before_save { |user| user.nickname = nickname.downcase }
before_save :create_remember_token
....validations......
private
def create_remember_token
self.remember_token = SecureRandom.urlsafe_base64
end
end
这是我的session.helper
module SessionsHelper
def sign_in(user)
cookies.permanent[:remember_token] = user.remember_token
self.current_user = user
end
def signed_in?
!current_user.nil?
end
def current_user=(user)
@current_user = user
end
def current_user
@current_user ||= User.find_by_remember_token(cookies[:remember_token])
end
def sign_out
self.current_user = nil
cookies.delete(:remember_token)
end
end
我试过 heroku rake db:migrate, heroku restart .. 没有变化.
I tried heroku rake db:migrate, heroku restart.. there is no change.
推荐答案
这意味着存储在 password_digest
中的哈希不是有效的 BCrypt 哈希(包括该字段是否为空).
This means that the hash stored in password_digest
is not a valid BCrypt hash (including if the field is empty).
根据评论,您似乎只是在 has_secure_password
不存在的时候创建了用户,因此密码摘要从未被存储.查看数据库,您可能会看到该用户的 password_digest
为空.从数据库中删除用户并使用新的工作代码重新创建,它应该可以工作.
Based on the comments, it looks like you just created the user at a time the has_secure_password
wasn't there, so the password digest never got stored. Look in the database, you'll probably see that password_digest
is empty for that user. Remove the user from the database and re-create with your new working code and it should work.
虽然在评论中讨论,但我对密码错误的原因进行了(错误的)猜测,并且我已经写下了解释.因此,这里适用于确实有此问题的任何未来访问者,即使它不直接适用于此处:
While discussing with in the comments though, I made an (incorrect) guess about why the passwords would be wrong, and I already wrote up the explanation. So here it is for any future visitor that does have this problem, even though it doesn't apply directly here:
当您从使用 SHA1 或其他算法切换到 BCrypt 但未能在 BCrypt 中重新散列密码时,通常会发生这种情况.由于您无权访问原始密码(或者至少您不应该......),切换有点难看,因为您必须同时使用 BCrypt 和原始身份验证方案.例如,如果您之前使用 SHA1 而现在使用 BCrypt,则必须将 SHA1 密码哈希视为 BCrypt 输入的纯文本密码.例如,您可以像这样创建 BCrypt 摘要:
This typically happens when you switch from using SHA1 or another algorithm to BCrypt but fail to re-hash the passwords in BCrypt. Since you don't have access to the original passwords (or at least you shouldn't...), it's a bit ugly to switch because you have to use both BCrypt and the original authentication scheme. For example, if you were using SHA1 before and now use BCrypt, you have to treat the SHA1 password hash as the plain text password for BCrypt input. For example, you might create a BCrypt digest like this:
sha1_password = Digest::SHA1.hexdigest("#{salt}#{real_password}")
self.password_digest = BCrypt::Password.create(sha1_password).to_s
然后,您可以根据您确实有权访问的 sha1 密码哈希创建 bcrypt password_digests.
Then, you can create bcrypt password_digests based on the sha1 password hashes that you do have access to.
您会像这样进行身份验证:
You would authenticate like this:
sha1_password = Digest::SHA1.hexdigest("#{salt}#{attempted_password}")
BCrypt::Password.new(self.password_digest) == sha1_password
我在上面的例子中使用了 SHA1,但这也适用于其他哈希算法.
I used SHA1 in the above examples, but this will work for other hashing algorithms as well.
这篇关于Rails:“BCrypt::Errors::InvalidHash"尝试登录时的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!