【问题标题】:What's the REST way to verify an email?验证电子邮件的 REST 方法是什么?
【发布时间】:2017-02-03 01:10:19
【问题描述】:

当用户注册我的网络应用程序时,我会发送一封电子邮件来验证他的收件箱。 在电子邮件中有一个指向这样的资源的链接:

GET /verify/{token}

既然资源是在​​后台更新的,是不是破坏了 RESTful 方式?

如何以 RESTful 方式进行操作?

【问题讨论】:

  • 没有在幕后添加任何东西吗?你会给他们一个表格来张贴改变吗?这将发布并更新密码,令牌只是允许他们正确查看表单..
  • 在幕后,我在数据库中搜索哪些用户拥有此令牌,并考虑到该用户的电子邮件有效,将该字段设置为 NULL。
  • 只需填写一个表格(不要触摸数据库)然后发布给自己并使用获取参数+获取参数并将其发布到数据库然后进行更新。如果用户点击了 URL,如果他们需要回来确定点击,您不想让他们再次点击它?

标签: rest email-validation


【解决方案1】:

您所说的不是 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 客户端,那么对 REST 服务的 HTTP 请求将完全在服务器上运行,您将不会在浏览器中看到任何有关它的信息。如果您有客户端 REST 客户端,那么您可以使用 AJAX CORS 在浏览器中发送 POST,或者您可以尝试使用 HTML 表单直接 POST(不推荐)。无论如何,激活应该是 POST 或 PUT。

【讨论】:

  • 我同意你的观点,激活应该是 POST 或 PUT。但在我没有经验的情况下,我认为 REST URI 中不应该是动词(在这种情况下是验证),但另一方面不存在 VERIFY HTTP 请求。
  • @user3482682 只有客户端的 URI 包含“验证”动词。服务的 URI 包含“验证”,它是一个名词。您在这里的主要问题是将浏览器与 REST 客户端混淆。浏览器不是 REST 客户端,它只是一个 HTTP 客户端。
  • 感谢 inf3rno 的建议,我将您的回答标记为有用。
  • 嗯,Web 是 REST 的最佳示例,但主要是 html 超媒体。
  • @andho REST 是关于机器-机器通信而不是关于人机,所以这不是真的。
【解决方案2】:

这取决于你想做什么。

它会在验证用户后触发电子邮件吗?如果是这样,它不是幂等方法,您应该使用 POST。

例子:

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

如果该方法除了更新没有任何后果,我认为你应该使用PUT。

【讨论】:

  • 如果意图是用户可以单击收到的电子邮件中的超链接,则 POST 和 PUT 是不可能的,除非您开始包含表单标签;如果用户将电子邮件视为纯文本,这将不起作用。
  • REST API 和这种集成之间的任何通信都需要一个网站来进行交互。电子邮件上的超链接需要将用户发送到网站,而不是 API。该网站将获得一个 GET /something?token=blabla 并将其发送到 REST API
【解决方案3】:

你是不是想太多 REST 了?通过电子邮件验证,您希望用户能够简单地单击他正在使用的任何邮件用户代理的链接,因此您最终会在服务器上得到一个简单的 GET(以超链接的形式呈现给用户)标记在路径中或作为查询字符串的一部分:

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

对于这个用例来说,两者都可以。它实际上并不是您正在获取或创建的资源;只是后端某些进程的触发器。

为什么你认为这会违反好的设计?

【讨论】:

  • 我认为这将运行良好的设计,因为在 REST URI 中不应该是动词(在这种情况下验证)。
  • 使用 GET 的确认链接可能会导致问题,因为它们可能会通过预取等方式自动确认。见artima.com/weblogs/viewpost.jsp?thread=152805
  • @Alex 是正确的,原因很明确。这篇文章可以追溯到 2006 年,但仍然有效。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-04-15
  • 2017-02-20
  • 1970-01-01
  • 1970-01-01
  • 2022-12-11
  • 2021-03-24
  • 2021-01-30
相关资源
最近更新 更多