首次登录时创建用户记录/配置文件

问题描述 投票:1回答:2

我使用身份验证服务Auth0来允许用户登录我的应用程序。该应用程序是一个与stackoverflow非常相似的问答平台。我在我的服务器上存储了一个用户配置文件,其中包含以下信息:“关于我”,投票,偏好等。

当新用户登录时,我需要做两件事之一:

  1. 对于现有用户 - 从我的api服务器检索用户配置文件
  2. 对于新用户 - 在数据库上创建新的配置文件

用户登录后,Auth0(身份验证服务)将向我发送有关用户的一些详细信息(唯一ID,姓名和电子邮件),但不会指示这是新用户(注册)还是现有用户(a登入)。

这不是一个复杂的问题,但理解最佳实践会很好。我可以想到两种不太理想的方法来解决这个问题:

**解决方案1 ​​ - GET请求**

  • 向api服务器发送get请求,传递唯一ID
  • 如果找到记录则返回
  • 否则在db上创建新的配置文件并返回新的配置文件

这似乎不正确,因为GET请求不应该写入服务器。

**解决方案2 - 一次GET和条件POST请求**

  • 向api服务器发送get请求,传递唯一ID
  • 服务器检查数据库并返回配置文件或错误消息
  • 如果api服务器返回错误消息,则发送post请求以创建新的配置文件
  • 否则重定向到主页

这似乎效率低下,因为我们需要2个请求来实现简单的结果。

任何人都可以了解什么是最佳做法?

rest post get api-design auth0
2个回答
1
投票

还有一个额外的选择。假设Auth0和应用程序中的用户数据库都是最新的,您可以使用Auth0中的rulePOST发送到API服务器中的/users/create端点(当用户第一次登录时)。

它看起来像这样:

[...]

var loginCount = context.stats.loginsCount;

if (loginCount == 1) {
  // send POST to your API and create the user
  // most likely you'll want to await for response before moving on with the login flow
}

[...]

另一方面,如果您指的是正确的API设计以及如何实现RESTful的查找或创建端点,maybe this answer is useful


1
投票

对于这篇文章中讨论的最佳方法和一些有趣的微妙之处似乎存在一些分歧:REST Lazy Reference Create GET or POST?

请阅读整篇文章,但我倾向于@Cormac Mulhall和@Blake Mitchell的回答:

客户端需要来自服务器的资源的当前状态。它不知道这可能意味着创建一个资源,它并不关心这是第一次有人试图获得此资源,也不是服务器必须在其端创建资源。

来自@Blake Mitchell提供的The RESTful cookbook的以下引用作出了微妙的区分,也支持了Mulhall的观点:

什么是幂等和/或安全方法?安全方法是不修改资源的HTTP方法。例如,在资源URL上使用GET或HEAD,不应该更改资源。但是,这并非完全正确。这意味着:它不会改变资源表示。安全方法确实可以改变服务器或资源上的内容,但这不应该反映在不同的表示中。

最后,这个关键区别是在Section 9.1.1 of the HTTP specification

当然,不可能确保服务器不会因执行GET请求而产生副作用;实际上,一些动态资源会考虑这个功能。这里的重要区别是用户没有请求副作用,因此不能对他们负责。

回到最初的问题,上面似乎支持解决方案1,即如果它尚不存在,则在服务器上创建配置文件。

© www.soinside.com 2019 - 2024. All rights reserved.