我使用身份验证服务Auth0来允许用户登录我的应用程序。该应用程序是一个Q&A平台,类似于stackoverflow。我将用户个人资料存储在服务器上,其中包含诸如“关于我”,投票,首选项等信息。
新用户登录后,我需要做2件事之一:
用户登录后,Auth0(身份验证服务)会向我发送有关该用户的一些详细信息(唯一ID,名称和电子邮件),但不会表明这是新用户(注册)还是现有用户用户(登录)。
这不是一个复杂的问题,但最好了解最佳实践。我可以想到两种不太理想的方法来解决此问题:
**解决方案1-GET请求**
这似乎是不正确的,因为GET请求不应写入服务器。
**解决方案2-一个GET和一个条件POST请求**
这似乎效率低下,因为我们需要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,即在服务器上不存在配置文件的情况下创建配置文件。