"BCrypt:: Errors:: InvalidHash" al intentar iniciar sesión
Estoy tratando de terminar un proyecto. Estoy trabajando con modelos de usuario. Cuando me registro todo parece estar bien . Pero cuando intento firmar con el mismo miembro obtengo este error.
Lo sentimos, pero algo salió mal. heroku logs el archivo muestra el error como:
BCrypt::Errors::InvalidHash (invalid hash):
app/controllers/sessions_controller.rb:8:in `create'
Mi * sessiones_controller * es:
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
Y el modelo de usuario es:
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
Esta es mi sesión.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
Probé heroku rake db:migrate, heroku restart.. no hay cambio.
2 answers
Esto significa que el hash almacenado en password_digest
no es un hash BCrypt válido (incluso si el campo está vacío).
Basado en los comentarios, parece que acaba de crear el usuario en un momento en que el has_secure_password
no estaba allí, por lo que el resumen de contraseña nunca se almacenó. Mira en la base de datos, probablemente verás que password_digest
está vacío para ese usuario. Elimine al usuario de la base de datos y vuelva a crear con su nuevo código de trabajo y debería funcionar.
Mientras discutía con en los comentarios, sin embargo, hice un (incorrecto) adivina por qué las contraseñas serían incorrectas, y ya escribí la explicación. Así que aquí está para cualquier visitante futuro que tenga este problema, aunque no se aplique directamente aquí:
Esto suele ocurrir cuando cambias de usar SHA1 u otro algoritmo a BCrypt pero no puedes volver a hash las contraseñas en BCrypt. Ya que no tienes acceso a las contraseñas originales (o al menos no deberías...), es un poco feo cambiar porque tienes que usar tanto BCrypt como el esquema de autenticación original. Por ejemplo, si estaba usando SHA1 antes y ahora usa BCrypt, debe tratar el hash de contraseña SHA1 como la contraseña de texto sin formato para la entrada de BCrypt. Por ejemplo, puede crear un resumen de BCrypt como este:
sha1_password = Digest::SHA1.hexdigest("#{salt}#{real_password}")
self.password_digest = BCrypt::Password.create(sha1_password).to_s
Luego, puede crear bcrypt password_digests basados en los hashes de contraseña sha1 a los que tiene acceso.
Usted autenticaría así:
sha1_password = Digest::SHA1.hexdigest("#{salt}#{attempted_password}")
BCrypt::Password.new(self.password_digest) == sha1_password
Usé SHA1 en los ejemplos anteriores, pero esto también funcionará para otros algoritmos de hash.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-06-14 17:37:30
Ya tenía usuarios en vivo, y del mismo modo ya guardé contraseñas sin cifrar en la base de datos. Una vez que comencé a usar bcrypt, esperaba una contraseña cifrada, y cuando no la encontró, produjo este error.
Por lo tanto, agregué este rescate para detectar el error y solicitar a los usuarios heredados que restablezcan su contraseña:
begin
# your code that attempts to login the user
rescue BCrypt::Errors::InvalidHash
flash[:error] = 'We recently adjusted the way our passwords are stored. Please click the "forgot username or password?" link to re-establish your password. Thank you for your understanding!'
redirect_to password_resets_url
end
Espero que esto ayude.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-11-06 15:30:47