Итак, я пытаюсь исправить механизм восстановления пароля для моих rails api, и я врезался в стену.
После некоторых исследований я нашел способ реализовать его. Он возвращает значения, как это работает, но пароль не сбрасывается, и я не знаю почему.
Моя таблица пользователей выглядит следующим образом:
create_table "users", force: :cascade do |t|
t.string "first_name"
t.string "middle_name"
t.string "last_name"
t.string "username"
t.string "email"
t.string "password_digest"
t.datetime "created_at", precision: 6, null: false
t.datetime "updated_at", precision: 6, null: false
t.string "reset_password_token"
t.datetime "reset_password_sent_at"
end
И мой способ сброса пароля идет: От контроллера:
...
def reset
token = params[:token].to_s
if params[:email].blank?
return render json: {error: 'Token not present.'}
end
user = User.find_by(reset_password_token: token)
if user.present? && user.password_token_valid?
if user.reset_password!(params[:password])
render json: {status: 'ok'}, status: :ok
else
render json: {error: user.errors.full_messages}, status: :unprocessable_entity
end
else
render json: {error: 'Link not valid or expired.'}, status: :not_found
end
end
...
Тогда модель:
...
def password_token_valid?
(self.reset_password_sent_at + 4.hours) > Time.now.utc
end
def reset_password!(password)
self.reset_password_token = nil
self.password = password
end
...
Это правильный способ реализовать это? Это самый безопасный способ реализовать это?
Примечание. Я проверял это только на производстве, это связано с ограничением среды разработки для отправки электронных писем.