Как лучше всего позволить пользователю сменить свой пароль?(с Rails API и has_secure_password) - PullRequest
0 голосов
/ 21 сентября 2018

В настоящее время я создаю небольшой веб-сайт для друга и хочу, чтобы он мог сменить свой пароль, поскольку тот, который он получит, засеян и виден из репозитория Git (не волнуйтесь, он здоровя знаю, что это первое, что ему придется изменить)

Я привык к Ruby on Rails в целом, но я впервые использую API вместо «стандартной» версииRails, и я совсем не знаком со всем, что касается токенов и тому подобного.

В бэк-офисе, где он может изменить некоторые элементы с веб-сайта, я создал определенную страницу, где он может изменить некоторые деталинапример, его биография, фотография в профиле, ссылки в социальных сетях и т. д. и т. д. На этой странице я добавил часть, в которой он может изменить свой пароль, с полями current_password, password и password_confirmation.Я также начал настраивать некоторые проверки, но дело в том, что если я введу 3 раза «пароль» в полях, я получу следующую ошибку:

ActiveRecord :: RecordInvalid |Проверка не удалась: пароль не может быть пустым

Меня беспокоит два элемента: во-первых, ошибка не возвращается как JSON, а как HTML (это мой первый вопрос, как можноЯ форсирую формат в JSON?), И я убедился, что пароли были отправлены в API (спереди VueJS, но это не проблема), но все равно появляется ошибка.

Вотмой код:

users_controller.rb

# ...
wrap_parameters :user, include: %i[password password_confirmatioon current_password]
# ...

def profile
  if @user.update(user_params)
    render json: @user, status: :ok
  else
    render json: @user.errors, status: :unprocessable_entity
  end

  @user.reset_password!(user_params[:new_password])
end

user.rb

class User < ApplicationRecord

  mount_base64_uploader :picture, BioFaceUploader
  include ActiveModel::Serializers::JSON
  has_secure_password

  attr_accessor :old_password
  attr_accessor :profile

  def generate_password_token!
    begin
      self.reset_password_token = SecureRandom.urlsafe_base64
    end while User.exists?(reset_password_token: reset_password_token)
    self.reset_password_token_expires_at = 1.day.from_now
    save!
  end

  def reset_password!(password)
    self.reset_password_token = nil
    self.password = password
    save!
  end

  def clear_password_token!
    self.reset_password_token = nil
    self.reset_password_token_expires_at = nil
    save!
  end
end

** редактировать: этоявляется входом в журнал сервера, когда я пытаюсь POST ввести новый пароль **

Started POST "/profile" for 127.0.0.1 at 2018-09-21 13:15:33 +0200
Processing by UsersController#profile as HTML
  Parameters: {"id"=>1, "email"=>"email@email.me", "password_digest"=>"[FILTERED]", [some more unrelated datas], "created_at"=>"2018-09-17T11:38:27.464Z", "updated_at"=>"2018-09-21T10:23:50.233Z", "reset_password_token"=>"[FILTERED]", "reset_password_token_expires_at"=>"[FILTERED]", "password"=>"[FILTERED]", "current_password"=>"[FILTERED]", "password_confirmation"=>"[FILTERED]", "user"=>{"password"=>"[FILTERED]", "current_password"=>"[FILTERED]"}}
  User Load (0.3ms)  SELECT  "users".* FROM "users" WHERE "users"."id" = ? LIMIT ?  [["id", 1], ["LIMIT", 1]]
  ↳ app/controllers/users_controller.rb:39
Unpermitted parameters: :password, :current_password
Unpermitted parameters: :password, :current_password
   (0.1ms)  begin transaction
  ↳ app/controllers/users_controller.rb:27
   (0.1ms)  commit transaction
  ↳ app/controllers/users_controller.rb:27
Unpermitted parameters: :password, :current_password
   (0.1ms)  begin transaction
  ↳ app/models/user.rb:21
   (0.1ms)  rollback transaction
  ↳ app/models/user.rb:21
Completed 500 Internal Server Error in 32ms (Views: 0.6ms | ActiveRecord: 1.5ms)

Как видите, 2 поля были неавторизованы, я добавил их в разрешенные параметры, но теперь у меня появляется следующая ошибка:

Неизвестный атрибут 'current_password' для пользователя

Должен ли я добавить его в список attr_accessor?

Что нужно сделать, чтобы исправитьэто?

Заранее спасибо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...