创建首次登录的用户记录/个人资料

时间:2019-03-06 22:31:11

标签: rest post get api-design auth0

我使用身份验证服务Auth0来允许用户登录我的应用程序。该应用程序是一个Q&A平台,类似于stackoverflow。我将用户个人资料存储在服务器上,其中包含诸如“关于我”,投票,首选项等信息。

新用户登录后,我需要做2件事之一:

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

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

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

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

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

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

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

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

这似乎效率低下,因为我们需要2个请求才能获得简单的结果。

任何人都可以阐明最佳做法吗?

2 个答案:

答案 0 :(得分:1)

还有一个额外的选择。您可以在Auth0中使用rule来向API服务器中的POST端点发送/users/create到API服务器中的[...] 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 } [...] 端点,假设Auth0中的用户数据库和在您的应用程序中是最新的。

它看起来像这样:

all_tab_modifications

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

答案 1 :(得分: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,即在服务器上不存在配置文件的情况下创建配置文件。