過去2時間、私はログインできないdeviseの奇妙な問題をデバッグしようとしています。
これも私が言及しているものです:
password
=> 'vinodsobale'
password == 'vinodsobale'
=> true
resource.valid_password?(password)
=> false
resource.valid_password?('vinodsobale')
=> true
スクリーンショットも添付:
注:devise内でデバッガーを有効にしたので、上記のコードはdevise内部コードです。
私には、Devise.secure_compare
の問題のようです。
Devise DatabaseAuthenticatable#valid_password?
はEncryptor::compare
と呼ばれるメソッドを使用しています。これには2つのオブジェクトが必要です。現在保存されているパスワードと比較する新しいパスワードです。このメソッドには2番目のパラメーターを変更する副作用があると思います途中で2回変更するのではなくオブジェクトを変更するため、誤った結果が発生するため、重複したパスワードオブジェクトを渡した場合に機能する可能性があります。 valid_password? password.dup
を使ってみませんか
いかがですか
resource.valid_password?(password.to_s)
皆さんのお役に立てば幸いです。
元のソースとコンソールの間のエンコーディングに問題がある可能性があります。 password.codepoints
を実行すると、実際のエンコーディングを確認できるはずです。生の「パスワード」文字列で.codepoints
を実行すると、[112, 97, 115, 115, 119, 111, 114, 100]
が返されます。