Учитывая, что он сказал сервис сброса для того, кто забыл ее пароль, а не сервис смены пароля для того, кто уже вошел в систему ...
Я бы использовал 2 услуги. Во-первых, чтобы запросить пароль для сброса пароля, и во-вторых, чтобы установить новый пароль с токеном, полученным в полученном письме.
Для 1-го:
POST baseUrl / passwordReset
Тело запроса
{
"email" : "my@self.com"
}
Это может быть POST или PUT, но поскольку доставка почты не является ресурсом, на который распространяется CRUD, давайте не будем педантичны и будем использовать старый POST, который всегда использовался в HTML-формах.
Очевидно, я бы контролировал, чтобы тот же клиент (ip? Browser? ...) не заставлял меня отправлять 20К писем в минуту.
Отправка почты пользователю не означает, что старый пароль недействителен. Это произойдет позже во втором запросе, когда новый обновит его.
Ответ 204 (возможно, вам следует сделать это, даже если вы не знаете это письмо, потому что если вы возвращаете ошибку, это означает, что если вы не возвращаете ошибку, вы подтверждаете незнакомцу, что данное письмо зарегистрировано)
Для 2-го:
POST baseUrl / пароль
Тело запроса
{
"token" : "3D21BA...4F",
"newPassword" : "m%4pW1!O"
}
Где токен получен по почте. Таким образом, письмо может иметь ссылку на страницу, включая токен, при загрузке страницы форма заполняется и отправляется, являясь токеном скрытого поля, которое некоторые JavaScript читает из URL и помещает сюда.
Это действительно ресурс, который вы обновляете, поэтому POST. И я не думаю, что имеет смысл иметь один и тот же URI с двумя глаголами для обоих, потому что они вовсе не являются одним и тем же ресурсом / сущностью.
Добавить
Кстати, я бы сделал только HTTPS, и поэтому я помещаю всю важную информацию в тело, а не параметры URL.