Как сбросить пароль на rails api? [Не используя устройство] - PullRequest
0 голосов
/ 11 марта 2020

Итак, я пытаюсь исправить механизм восстановления пароля для моих 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
...

Это правильный способ реализовать это? Это самый безопасный способ реализовать это?

Примечание. Я проверял это только на производстве, это связано с ограничением среды разработки для отправки электронных писем.

1 Ответ

0 голосов
/ 11 марта 2020

Вы просто обновляете значения в памяти и никогда не сохраняете их в базе данных.

def reset_password!(password)
  update!(
    password: password,
    reset_password_token: nil
  )
end

Это самый безопасный способ реализовать это?

Нет. Обновление колеса аутентификации - одна из самых распространенных причин взлома приложений.

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