Bizarre problème avec le mot de passe valid_password?

Au cours des deux dernières heures, j’ai essayé de déboguer un problème étrange dans un appareil qui ne me permet pas de me connecter.

Voici les choses dont je parle aussi:

password => 'vinodsobale' password == 'vinodsobale' => true resource.valid_password?(password) => false resource.valid_password?('vinodsobale') => true 

Joindre la capture d’écran aussi:

entrer la description de l'image ici Remarque: J’ai activé le débogueur à l’intérieur de l’appareil afin que le code ci-dessus soit conçu en code interne.

Pour moi, cela ressemble à un problème dans Devise.secure_compare .

Ce problème est dû à un bogue de corruption de chaînes connu dans Ruby 2.2.0 qui a été corrigé dans la version 2.2.2.

Comme décrit dans le rapport de bogue , la corruption s’est produite lorsque BCrypt a appelé une API de création de chaîne spécifique à partir de son extension C, que Devise v3.3.0 a déclenchée en appelant ::BCrypt::Engine.hash_secret depuis Devise::Models::DatabaseAuthenticatable#valid_password? méthode. Une solution de contournement spécifique à Devise pour ce bogue a été publiée dans la version 3.5.0.

La solution consiste soit à:

  • Rétrograder Ruby vers < 2.2.0 , ou mettre à niveau vers >= 2.2.2 ;
  • Mettre à niveau Devise à >= 3.5.0 .

Que diriez-vous

 resource.valid_password?(password.to_s) 

J’espère que cela vous aidera.

Devise DatabaseAuthenticatable#valid_password? utilise une méthode appelée Encryptor::compare it prend 2 objects, le mot de passe stocké actuel et le nouveau mot de passe que vous souhaitez comparer, je pense qu’il y a un effet secondaire pour cette méthode qui modifie le second paramètre au milieu afin de modifier l’object au lieu d’une fois il sera modifié deux fois, ce qui conduit à un résultat faux, de sorte qu’il peut fonctionner si vous avez passé un object de mot de passe en double. pouvez-vous essayer d’utiliser valid_password? password.dup valid_password? password.dup

Cela peut être un problème avec l’encodage entre la source d’origine et votre console. Si vous exécutez password.codepoints , vous devriez pouvoir voir l’encodage réel. L’exécution de .codepoints sur la chaîne brute ‘password’ doit renvoyer [112, 97, 115, 115, 119, 111, 114, 100] .