创build用户帐户时更正HATEOAS响应
我有一个使用HATEOAS的节点写的REST api。 用户需要有一个帐户,才可以访问它的大部分。
他们注册一个具有login详细信息的帐户,然后login以获取访问令牌,然后使用该令牌访问任何未register
或login
端点。
向根发出一个响应,并带有可用动作的目录。
问: register
的正确答案是什么,告诉客户接下来可以做什么(即login)?
-
register
技术上在服务器上创build一个新的资源,所以一个201 CREATED
和一个Location
标题看起来是适当的。 但是,login
引用不是新创build的资源的位置。 -
我应该返回
201 Created
与指向新创build的用户(例如/myaccount
或/users/{id}
,然后在响应正文中包含一个login链接?
{ _links:{ 自我:{href:“这里有什么?” }, x:login:{href:“/ login”} } }
- 我是否根本不告诉客户,并要求他们去
get
应用程序根目录,以获取可用端点的列表。 无论如何,这应该包括login
。 假设客户端必须这样做,首先要获得register
链接,它应该已经login
。
期望客户已经有login链接感到不舒服,因为它依赖于客户的先前活动的假设。
要求客户在注册后向根目录发出另一个请求似乎意味着低效和不必要。 如果客户端刚刚创build了一个资源,服务器应该用下一步可以做的事情做出回应似乎是公平的。
我喜欢让我的api的行为与网页没有区别。 如果你想让你的应用程序的用户名在注册后被login,那么将它们从一个成功的registry中注册到login资源。 并成功login后,302他们到适当的目的地(IE,如果他们试图访问的东西没有令牌,然后带他们login,与原始请求的资源的目的地)。 这对你的#3是重要的一部分。 有一个链接从根本上导致login,但你需要保护所有其他链接,以便它们指示(和链接)访问资源所需的login名。 客户端应用程序应该随时获得此login所需的响应,因为令牌随时可以(并且)到期。
在此之后,将JWT作为一个cookie而不是Authorization Header可能是有意义的,这会让客户端更容易一些(他们只需要设置一个cookie jar)。如果客户端是说原生移动应用程序,保持单一的连接设置。 如果是服务器到服务器,那么auth头是有道理的。 我会去支持这两种情况。
继续把api作为一个网站的想法。 为什么他们在注册后login呢? 为什么不注册一个帐户最终的login令牌被发送? 他们只是设置他们的用户/通行证,为什么让他们再次进入呢? 我认识到一些更奇特的体系结构注册服务不能执行login操作(也许它没有私钥签署令牌),但如果可能的话,我会考虑它。
如果你真的想坚持201头(这很好,只要确保你的注册关系的文档表明),然后选项2是最接近我的意见。 创build用户的帐户的URL的位置标题刚刚创build一个201是非常标准的。 但是,我不会回到你所认为的。 你是返回一个账户创build的资源(与login链接的东西),但你真的需要这个自定义资源? 如果你想在这个资源中给客户端一些消息(比如“Account Created”),那么肯定是的,但是你也可以把它们还给根资源。
TL;博士; 决定你想要你的UX,然后让你的API实现你的UX。