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:
- Infos sur l'utilisateur est-il dans le DB (utilisateur existant). Mot de passe crypté avec bcrypt
- 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
- signes-utilisateur sur
- 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'.
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? –
@ma_il ajouté le code comme demandé. – Farhad