Каков REST-способ проверки электронной почты?

Когда пользователь регистрируется в моем веб-приложении, я отправляю электронное письмо, чтобы проверить его почтовый ящик. В письме есть ссылка на такой ресурс:

GET /verify/{token}

Поскольку ресурс обновляется за кулисами, не нарушает ли это подход RESTful?

Как я могу сделать это в режиме RESTful?


person user3482682    schedule 25.09.2016    source источник
comment
Не добавляет ничего за кадром? Вы дадите им форму для публикации, чтобы изменить ее? Это будет публикация и обновление пароля, токен просто позволит им правильно видеть форму.   -  person Matt The Ninja    schedule 25.09.2016
comment
За кулисами я ищу в БД, у какого пользователя есть этот токен, и устанавливаю в поле значение NULL, учитывая действительный адрес электронной почты этого пользователя.   -  person user3482682    schedule 25.09.2016
comment
Просто перейдите в форму (не трогайте БД), затем отправьте сообщение себе и используйте параметр получения + параметр получения, отправьте его в БД и затем выполните обновления. Если пользователь нажимает на URL-адрес, вы не хотите, чтобы он снова нажимал на него, если им нужно вернуться, чтобы нажать обязательно?   -  person Matt The Ninja    schedule 26.09.2016


Ответы (3)


То, о чем вы говорите, это не REST. REST предназначен для связи между машинами, а не для связи человека с машиной. Вы можете разработать сторонний клиент REST, который отправляет активацию в службу REST.

Вы можете использовать свой URI подтверждения в браузере для доступа к клиенту REST:

# user follows a hyperlink in the browser manually

GET example.com/client/v1/verify/{token}
# asking the client to verify the token

и после этого клиент REST получит гиперссылку для проверки от службы REST и отправит POST в службу в фоновом режиме.

# the REST client follows the hyperlinks given by the service automatically
# the REST client can run either on the HTTP client or server side

GET example.com/api/v1
# getting the starting page of the REST service
# getting the hyperlink for verification

POST example.com/api/v1/verification {token}
# following the verification hyperlink

Если у вас есть сторонний клиент REST на стороне сервера, то HTTP-запросы к службе REST будут полностью выполняться на сервере, и вы ничего не увидите об этом в браузере. Если у вас есть REST-клиент на стороне клиента, вы можете отправить POST в браузере с помощью AJAX CORS или попробовать отправить POST напрямую с помощью HTML-формы (не рекомендуется). В любом случае активация должна быть POST или PUT.

person inf3rno    schedule 25.09.2016
comment
Я согласен с вами, что активация должна быть POST или PUT. Но, по моему неопытному мнению, я думаю, что в REST URI не должно быть глагола (в данном случае проверить), но, с другой стороны, не существует HTTP-запроса VERIFY. - person user3482682; 25.09.2016
comment
@user3482682 user3482682 Только URI клиента содержит глагол проверки. URI службы содержит проверку, которая является существительным. Ваша главная проблема здесь в том, что вы путаете браузер с REST-клиентом. Браузер не является REST-клиентом, это просто HTTP-клиент. - person inf3rno; 25.09.2016
comment
Спасибо inf3rno за ваши советы, я отметил ваш ответ как полезный. - person user3482682; 25.09.2016
comment
Что ж, Интернет — лучший пример REST, но в основном гипермедиа html. - person andho; 15.09.2018
comment
@andho REST предназначен для машинно-машинного взаимодействия, а не для человека и машины, так что это неправда. - person inf3rno; 15.09.2018
comment
Я использую библиотеку запросов для обработки нового запроса внутри моего API-оста, поэтому в моем GET endoint, если существует токен, я делаю запрос к конечной точке PUT для обновления моего значения user.isActive и возвращаю ответ с успехом или с ошибкой, если он был любая ошибка. - person J.Correa; 06.01.2019

Это зависит от того, что вы пытаетесь сделать.

Например, он запускает электронное письмо после проверки пользователя? Если это так, это не идемпотентный метод, и вы должны использовать POST.

Пример:

POST /users/{id}/verify/{token}

Если метод не имеет никаких последствий, кроме обновления, я думаю, вам следует использовать PUT.

person Bruno Costa    schedule 25.09.2016
comment
Если предполагается, что пользователь может щелкнуть гиперссылку в полученном электронном письме, POST и PUT невозможны, если вы не начнете включать теги формы; который не будет работать, если пользователь просматривает электронную почту как обычный текст. - person JeroenHoek; 25.09.2016
comment
Для любого взаимодействия между REST API и такой интеграцией потребуется веб-сайт для взаимодействия. Гиперссылка в электронном письме должна направлять пользователя на веб-сайт, а не на API. Веб-сайт получит GET /something?token=blabla и отправит его в REST API. - person Bruno Costa; 25.09.2016

Вы не слишком много думаете об ОТДЫХЕ? С проверкой электронной почты вы хотите, чтобы пользователь мог просто щелкнуть ссылку из любого почтового агента пользователя, который он использует, поэтому вы получите простой GET на сервере (представленный как гиперссылка на пользователя) с токен либо в пути, либо как часть строки запроса:

GET http://example.com/verify-email/TOKEN
GET http://example.com/verify-email?token=TOKEN

Любой из них подходит для этого варианта использования. На самом деле это не ресурс, который вы получаете или создаете; просто триггер для некоторого процесса на бэкэнде.

Как вы думаете, почему это противоречит хорошему дизайну?

person JeroenHoek    schedule 25.09.2016
comment
Я думаю, что это будет противоречить хорошему дизайну, потому что в URI REST не должно быть глагола (в этом случае проверьте). - person user3482682; 25.09.2016
comment
Ссылки подтверждения с использованием GET могут вызвать проблемы, поскольку они могут автоматически подтверждаться предварительной выборкой и т. д. См. artima.com/weblogs/viewpost.jsp?thread=152805. - person Alex; 19.05.2018
comment
@Alex прав по ясной причине. Статья восходит уже к 2006 году, но все еще актуальна. - person Bernoulli IT; 09.09.2019