Подтвердить что ты не робот

Странная проблема с разработкой valid_password?

В течение последних 2 часов я пытаюсь отладить странную проблему в разработке, которая не позволяет мне войти в систему.

Вот что я имею в виду:

password 
=> 'vinodsobale'

password == 'vinodsobale'
=> true

resource.valid_password?(password)

=> false

resource.valid_password?('vinodsobale')

=> true

Прикрепление скриншота:

введите описание изображения здесь  Примечание. Я включил отладчик внутри устройства, поэтому приведенный выше код разрабатывает внутренний код.

Мне кажется, что это проблема в Devise.secure_compare.

4b9b3361

Ответ 1

Эта проблема связана с известной ошибкой строковой коррупции в Ruby 2.2.0, которая была исправлена ​​ в 2.2.2.

Как описано в отчете об ошибке , коррупция произошла, когда BCrypt вызвал конкретный API-интерфейс создания строки из своего расширения C, которое Devise v3.3.0, вызванный вызовом ::BCrypt::Engine.hash_secret из метода Devise::Models::DatabaseAuthenticatable#valid_password?. Обходной метод для этой ошибки был опубликован в версии 3.5.0.

Решение состоит в следующем:

  • Понизить Ruby на < 2.2.0 или обновить до >= 2.2.2;
  • Обновите Devise до >= 3.5.0.

Ответ 2

Как насчет

resource.valid_password?(password.to_s)

Надеюсь, это поможет вам.

Ответ 3

Devise DatabaseAuthenticatable#valid_password? использует метод под названием Encryptor::compare он принимает 2 объекта, текущий сохраненный пароль и новый пароль, который вы хотите сравнить, я считаю, что для этого метода существует побочный эффект, который модифицирует второй параметр в посредине, так что он изменит объект вместо того, как он будет дважды изменен, что приведет к ложному результату, поэтому он может работать, если вы передали дублированный объект пароля. вы можете использовать valid_password? password.dup

Ответ 4

Это может быть проблема с кодировкой исходного источника и вашей консоли. Если вы запустите password.codepoints, вы сможете увидеть фактическую кодировку. Выполнение .codepoints в строке необработанного пароля должно возвращать [112, 97, 115, 115, 119, 111, 114, 100].