Разработать с JWT - восстанавливаемый reset_password_by_token - PullRequest
1 голос
/ 16 мая 2019

Я работаю над Rails API, который будет аутентифицироваться с помощью jwt и хотел бы, чтобы учетные записи пользователей могли быть восстановлены.Предположительно, после получения токена сброса по электронной почте, пользователи предоставят свой новый пароль и токен с PUT на https://example.com/users/password, который будет обрабатываться /app/controllers/users/passwords_controller#update.В настоящее время я получил это в passwords_controller.rb (в основном как в коде Devise по умолчанию):

  # PUT /resource/password
  def update
    # {"user": {"password": "secret", "password_confirmation": "secret", "reset_password_token": "token_goes_here"}}
    self.resource = resource_class.reset_password_by_token(resource_params) # problem here (line 33)...
    yield resource if block_given?

    if resource.errors.empty?
      resource.unlock_access! if unlockable?(resource)
      if Devise.sign_in_after_reset_password
        resource.after_database_authentication
        auth_options = {user: {login: resource.username, password: params['user']['password']}}
        warden.authenticate!(auth_options)
        render json: {success: true, jwt: current_token, response: "Authentication successful" }
      else
        render json: {success: false, response: "Authentication failed" }
      end
    else
      set_minimum_password_length
      respond_with resource
    end
  end

Проблема в том, что reset_password_by_token запрашивает авторизацию:

 app/controllers/users/passwords_controller.rb:33:in `update'
Completed 401 Unauthorized in 220ms (ActiveRecord: 60.8ms | Allocations: 6810)

Мне это кажется странным, так как я ожидаю, что пользователь сможет войти в систему один раз с токеном (если не истек срок действия) для смены пароля.В этот момент я хотел бы вернуть jwt (следовательно, используя warden.authenticate), чтобы клиентское приложение могло немедленно использовать его для входа пользователя.

Кто-нибудь сможет указать мне вправильное направление здесь?

1 Ответ

0 голосов
/ 16 мая 2019

Концептуально поток функциональности сброса пароля при использовании Rails в качестве поставщика API может быть следующим:

  • Пользователь нажимает ссылку сброса пароля на внешнем интерфейсе. Внешний интерфейс выполняет API-вызов к POST / auth / password , который отправляет электронное письмо пользователю.
  • Ссылка (из почтового ящика пользователя) переносит пользователя на сервер ( GET / auth / password / edit ), где токен проверяется, а затем сервер перенаправляет пользователя на фронт -end с токеном в параметрах запроса URL.
  • Используя этот токен, клиентский интерфейс выполняет API-вызов к PUT / auth / password с параметрами password и password_confirmation для установки нового пароля.
...