2017-09-02 1 views
1

nous utilisons les éléments suivants dans devise.rbBcrypt :: Erreurs :: InvalidHash (Hash non valide) 1.5.4 Rails 2.2.5 Elaborer des

config.encryptor = :bcrypt 

Nous voulions changer cela

config.encryptor = :authlogic_sha512 

Code écrit également à déchiffrer ancien mot de passe et de hachage à nouveau lors de la connexion (à l'intérieur contrôleur de session)

Cependant, après la mise à jour du mot de passe, en signant et en signant en, il donne une erreur

BCrypt::Errors::InvalidHash (invalid hash): 

Cette erreur survient à des endroits aléatoires si je commente le point d'origine de l'erreur. Donc, je suppose qu'il y a quelque chose qui ne va pas avec la configuration du système OU avec le modèle user.rb.

Le modèle utilisateur a la ligne suivante:

devise :database_authenticatable, :registerable, :confirmable, 
    :recoverable, :rememberable, :trackable, :validatable, :omniauthable, :omniauth_providers => [:auth0, :google_oauth2] 

Ainsi, la séquence des étapes est la suivante:

  1. Infos sur l'utilisateur est-il dans le DB (utilisateur existant). Mot de passe crypté avec bcrypt
  2. utilisateur signes-et dans le contrôleur de sessions, nous re-hachage le mot de passe SHA512 et le stocker dans le champ encrypted_password
  3. signes-utilisateur sur
  4. signes-utilisateur dans *** Impossible de signer en raison de l'erreur 'invalid_hash'.

Une idée de ce qui pourrait être le problème ici? Merci d'avance.

Edit: Code pour l'étape 2 ci-dessus comme demandé:

class Users::SessionsController < Devise::SessionsController 
... 
... 
email = params[:user]['login'] 

@user = User.find_by_email(email) 
return if @user.nil? 
# Get old password and salt 
bcrypt = BCrypt::Password.new(@user.encrypted_password) 
salt = bcrypt.salt 

pwd = params[:user]['password'] 

pass = ::BCrypt::Engine.hash_secret("#{pwd}#{Devise.pepper}", salt) 
# If passwords, match, re-hash it with SHA-512 
if @user.encrypted_password == pass 
    @user.password_digest = ::Devise::Encryptors::AuthlogicSha512.digest(pass, Devise.stretches, salt, Devise.pepper) 
    @user.password_salt = salt 
    @user.save! 
end 

J'ai aussi ajouté 'password_digest' et 'password_salt' dans la table db, mais mon «sauver! La méthode échoue alors avec 'les arguments supplémentaires non passés'.

+0

Le code source actuel de # 2 pourrait être utile car c'est probablement là que réside le problème. Je suppose que vous surchargez 'SessionController' de Devise? Comment? –

+0

@ma_il ajouté le code comme demandé. – Farhad

Répondre

0

Il semble que vous supposiez que le mot de passe de l'utilisateur est haché avec BCrypt même s'il a déjà été converti en Authlogic lors de la première exécution. Vous pouvez vérifier si @user.password_digest.present? et si tel est le cas, vous devriez probablement vérifier le mot de passe des paramètres par rapport à cela.

En outre, lors de la création du condensé pour Authlogic, vous prenez la valeur déjà chiffrée en pass et en la hachant à nouveau. Au lieu de cela, lors de la création du condensé authlogic, il ne requiert que le mot de passe des paramètres.

+0

Où est ce que password_digest sera défini? Chaque fois que j'essaie d'y accéder, il est écrit "erreur d'accès au champ protégé". Désolé pour les questions noob, mais je suis nouveau à ruby. Password_digest doit-il également être un champ dans la table DB 'users'? Qu'en est-il de password_salt? – Farhad

+0

u.password_digest.present? NoMethodError: méthode protégée 'password_digest 'appelée pour # Farhad