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:
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 à:
< 2.2.0
, ou mettre à niveau vers >= 2.2.2
; >= 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]
.