Поэтому я реализовал систему аутентификации в моем API-интерфейсе rails, используя драгоценные камни knock
и bcript
. Поэтому я добавил has_secure_password
в свою модель пользователя, и когда новый пользователь создается, он имеет атрибут password_digest
в базе данных.
Сейчас я создаю возможность для конечного пользователя изменить свой пароль. По соображениям безопасности я хочу запросить старый пароль, проверить, правильный ли указанный старый пароль, и, если да, обновить пароль пользователя. В противном случае отправьте сообщение об ошибке.
Вот что я написал:
def update_password
@user = User.find(params[:id])
if params[:password][:oldPassword] === @user.password
if @user.update(password: params[:password][:newPassword])
render json: @user
else
render json: @user.errors, status: :unprocessable_entity
end
else
render json: {erreur: "the current password is wrong"}, status: :unprocessable_entity
end
end
Моя проблема здесь: params[:password][:oldPassword] === @user.password
для проверки действительности текущего пароля не работает: он всегда будет возвращать false
.
Как я могу сделать это правильно?
Вы сравниваете тип пароля с переваренным хешем, поэтому он всегда возвращает false. то есть пользователь вводит свой старый пароль «123456», но система не может получить доступ к этой строке, когда она запрашивает базу данных, она возвращает что-то вроде «$ 2a $ 12 $ .FMAPyhKwOyg.bHti8aFzuOcBw1w2ho1HI5IOloa4vlSMnAMMNtJC». Это мера безопасности, вызванная bcript. Чтобы проверить это, вы должны использовать метод .authenticate (: password), он зашифрует «123456» в хэш, а затем сопоставит его с базой данных.
Возможно, это не то, что вы ищете, но несколько месяцев назад я столкнулся с аналогичной проблемой, решение для правильного сравнения этих паролей - использовать bcrypt
, как показано ниже:
BCrypt::Password.new(new_password) == (user.password)
Порядок элементов в выражении важен, потому что Rails устанавливает правильный компаратор, а это означает, что экземпляр bcrypt
должен находиться слева.
почему это ошибка, если пароль неправильный. вместо запуска else if пароль не совпадает.