Проверить пароль при использовании рельсов password_digest

Поэтому я реализовал систему аутентификации в моем 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.

Как я могу сделать это правильно?

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
916
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Есть метод user.authenticate(pass).

почему это ошибка, если пароль неправильный. вместо запуска else if пароль не совпадает.

Jenuel Ganawed 22.01.2020 06:11

Вы сравниваете тип пароля с переваренным хешем, поэтому он всегда возвращает false. то есть пользователь вводит свой старый пароль «123456», но система не может получить доступ к этой строке, когда она запрашивает базу данных, она возвращает что-то вроде «$ 2a $ 12 $ .FMAPyhKwOyg.bHti8aFzuOcBw1w2ho1HI5IOloa4vlSMnAMMNtJC». Это мера безопасности, вызванная bcript. Чтобы проверить это, вы должны использовать метод .authenticate (: password), он зашифрует «123456» в хэш, а затем сопоставит его с базой данных.

Возможно, это не то, что вы ищете, но несколько месяцев назад я столкнулся с аналогичной проблемой, решение для правильного сравнения этих паролей - использовать bcrypt, как показано ниже:

BCrypt::Password.new(new_password) == (user.password)

Порядок элементов в выражении важен, потому что Rails устанавливает правильный компаратор, а это означает, что экземпляр bcrypt должен находиться слева.

Другие вопросы по теме