Я начну с указания, что аутентификация часто обрабатывается вне модели REST. Когда пользователь предоставляет свои учетные данные, он не предоставляет REpresentation состояния своего аккаунта (REST); и не ответ они получают такое представление. Поскольку состояние ресурса учетной записи пользователя не включает как «текущий», так и «новый» пароли, предоставление как «текущего», так и «нового» пароля в запросе никогда не может действительно соответствовать модели REST, но профессионалы часто описывают «континуум» RESTfulness, причем некоторые API полностью RESTful, а другие находятся между RPC (удаленный вызов процедуры) и REST.
Нередко имеется компонент RESTful API, который обрабатывает обслуживание моделей данных, и компонент RPC API, который обрабатывает учетные записи пользователей. Вы должны выбрать между двумя. Если ваш проект включает в себя суперпользователей, которые управляют несколькими учетными записями пользователей, я бы посоветовал попытаться включить это в API REST. Если каждый пользователь управляет только своей учетной записью, я бы предложил RPC.
Если вы решили использовать REST для управления учетными записями, то вы должны выбрать подходящий метод HTTP (GET, POST, DELETE, HEADERS и т. Д.). Очевидно, вам нужен метод, который будет влиять на изменения на сервере (POST, PUT, DELETE и т. Д.). В отличие от вывода пользователя orbfish, приведенного выше, я хочу сказать, что PUT будет подходящим методом при определенных ограничениях.
From RFC 2616 , который формально определяет наши методы HTTP:
"Методы также могут иметь свойство idempotence в том смысле, что (кроме ошибок, связанных с ошибкой или истечением срока действия) побочные эффекты от N> 0 идентичных запросов такие же, как и для одного запроса. Методы GET, HEAD, PUT и DELETE разделяют это свойство. Кроме того, методы OPTIONS и TRACE НЕ ДОЛЖНЫ иметь побочных эффектов и поэтому являются идемпотентными по своей природе. "
Идемпотентность здесь означает, что если мы сделаем один и тот же запрос n раз подряд, состояние сервера под воздействием n -го запроса будет таким же, как состояние сервера под влиянием первого запроса. Пользователь orbfish правильно отмечает, что если мы сделаем запрос:
PUT /users/:id/account {current-password: 'a', new-password: 'b'}
и повторите это:
PUT /users/:id/account {current-password: 'a', new-password: 'b'}
что наш первый запрос должен получить ответ, указывающий на успех, и наш второй запрос должен получить ответ, указывающий на ошибку. Однако идемпотентность PUT требует только того, чтобы состояние сервера было одинаковым после обоих запросов. И это: после первого запроса пароль пользователя «b», а после второго запроса пароль пользователя «b».
Я упомянул ограничения выше. Возможно, вы захотите заблокировать пользователя после m попыток изменить пароль безуспешно; это обеспечило бы защиту от атак методом перебора паролей. Однако это нарушит идемпотентность запроса: отправьте действительный запрос пароля один раз, и вы измените свой пароль, отправьте его m больше раз, и сервер заблокирует вас.
Указывая метод PUT, вы сообщаете всем клиентам, что отправка запроса безопасна столько раз, сколько необходимо. Если я, как клиент, отправляю запрос PUT, и наше соединение прерывается, так что я не получаю ваш ответ, я знаю, что безопасно повторно отправить мой PUT, потому что он идемпотентен: идемпотентность означает, что если вы получаете оба запроса, то он будет таким же для вашего сервера, как и для получения. Но если вы собираетесь заблокировать меня из-за неудачного запроса, отправлять второй запрос небезопасно, пока я не узнаю, получил ли вы первый.
По этой причине вы можете рассмотреть PATCH или POST. Я бы предложил использовать PATCH. Принимая во внимание, что POST описывается как добавление нового ресурса в список или добавление данных к существующему ресурсу, PATCH описывается как «частичное обновление» ресурса по известному URI. И в отличие от PUT, PATCH не обязательно должен быть идемпотентом.