Изменить пароль в RESTful API (проверка сервера на PATCH)

В RESTful API у меня есть пользовательские ресурсы на /users и /users/:id с их именами пользователей, адресами электронной почты и паролями.

Когда я хочу обновить информацию о пользователях, я могу легко сделать PATCH:/users/:id с некоторыми JSONPatch данными.

Теперь проблема в том, что я не могу понять, как обрабатывать сценарий изменить пароль с формой currentPassword, newPassword и newPasswordConfirm.

Какой МЕТОД следует использовать (PATCH кажется подходящим, но проблематичным) и каким образом следует передавать данные (тело/заголовок/...).

В более широком смысле — как следует обрабатывать исправление с дополнительными полями для проверки.

Этот пост кажется связанным, но не охватывает именно эту тему.


person Aides    schedule 18.04.2016    source источник


Ответы (2)


Вместо PATCH для частичного обновления ресурса user вы когда-нибудь рассматривали возможность замены пароля PUT?

Ваша конечная точка может быть /users/:id/password, где пароль — это дополнительный ресурс ресурса user. И ваш запрос на замену пароля будет выглядеть так:

PUT /users/1/password HTTP/1.1
Host: api.example.com
Content-Length: 113
Content-Type: application/json
Authorization: Basic YWRtaW46c2VjcmV0

{
    "currentPassword" : "secret",
    "newPassword": "othersecret",
    "newPasswordConfirm" : "othersecret"
}
person cassiomolin    schedule 18.04.2016
comment
Я рассмотрел это решение, но хотел избежать раскрытия отдельных полей в API. Кроме того, я бы предпочел использовать метод POST, поскольку операция PUT определена как идемпотентная, а эта операция явно не такова. - person Aides; 18.04.2016
comment
Не могли бы вы посмотреть на мой ответ и оставить отзыв? - person Aides; 18.04.2016

После более глубокого изучения JSONPatch я смог придумать способ добавления test операций в данные патча.

Это может выглядеть примерно так:

[
    { "op": "test", "path": "/password", "value": "oldPassword" },
    { "op": "replace", "path": "/password", "value": "newPassword" },
    { "op": "test", "path": "/password", "value": "newPasswordConfirm" }
]

Есть ли какие-либо опасения при использовании этого метода?

person Aides    schedule 18.04.2016
comment
Я думаю, что этот подход будет работать нормально. Однако, ИМХО, подход PUT проясняет ситуацию. - person cassiomolin; 18.04.2016
comment
Хорошо, одна вещь, которая может нарушить сделку, — это тот факт, что мне нужно будет убедиться, что потребитель действительно использует этот формат запроса. Без дальнейшей проверки на стороне сервера потребитель может просто отправить замену без тестовых случаев. - person Aides; 18.04.2016