"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.

Author: Ben Lee, 2012-06-14

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.

 73
Author: Ben Lee,
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.

 9
Author: nfriend21,
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