繁体   English   中英

使用身份验证作为上下文RESTful吗?

[英]Is using authentication as context RESTful?

我想知道是否隐式使用当前经过身份验证的用户作为API交互的上下文是否为RESTful。 例如,假设我所有的API调用都使用标准HTTP安全性进行了身份验证:

检索用户订单列表的查询是否应该明确?
否: http : //example.com/orders
是: http : //example.com/orders? userid= 1234

放置POST以创建新订单时,JSON是否应包含用户?
否:{orderref:'EXAM / 1',项目:{...}}
是:{userid:1234,orderref:“ EXAM / 1”,项目:{...}}

无论哪种方式,我都将确保API仅允许当前用户执行操作,但是我应该让API调用者声明每个操作的用户ID吗?

我想说的是,如果您可以访问许多用户的订单并需要按用户过滤它们,则仅应将用户ID作为查询传递。

如果用户只能访问自己的订单,则不必传递用户ID-基本查询集应根据自己的身份验证详细信息对其进行限制。 可以说它可能不是RESTful的,但是不必担心-大多数API可能不是100%RESTful的,您应该对您的应用程序做有意义的事情,而不用担心它是否是RESTful的-它是指南,而不是铸铁需求。

在任何情况下,都取决于您使用哪种身份验证类型(BASIC或令牌),您必须在对API发出请求的API调用(标头)中发送用户信息。

因此,当您说从Context使用经过身份验证的用户是否有效时,当然是

这里的示例代码

api调用

headers.Authorization = 'Bearer ' + localStorage.getItem("tokenkey");

从请求中获取用户

RequestContext.Principal.Identity.Name

它是RESTful的吗? 我会说:是的。 没有REST规范,所以没有什么可以说不是。 HTTP确实允许这样做,并且HTTP缓存实际上默认情况下应将对带有Authorization标头的GET请求的响应视为私有。

您应该使用这种设计吗? 我不知道! 我认为使用每个用户的端点是有好处的,因为将来它可能允许用户A检查用户B的订单。

实际上,在我们的API中,我们有一个与您的API类似的示例,但是我们两者都有。

  1. 我们有一个/users/1234端点。
  2. 我们也有一个/current-user端点。

最初, /current-user端点只是重定向到实际当前用户的uri,但最终我们决定实际上只是返回不重定向的完整对象(由于浏览器的重定向行为不佳)。

current-user端点确实有一个指向实际用户资源的self链接。

总结一下。 我认为您很清楚,但是我认为创建具有一致表示形式的资源(无论是谁看)都具有强大的设计优势。 它使事情变得更简单更好。

并且也不要忘记,如果您实际上正在遵循REST,那么没有理由没有理由。 客户只需要关心的是在某处有一个指向订单列表的链接,而不管它的URL是什么。

+1为Matthew Daly的答案。 尤其是当经过身份验证的用户只能访问自己的订单时(我认为是这样)。

如果您的经过身份验证的用户可以访问的订单列表不仅限于他自己的列表,我将这样做:

/orders: the authenticated user's orders.
/orders/123: the specific user's orders.

如果123等于通过身份验证的用户的ID,那又如何? 对于您的客户而言,最有可能的情况是没有问题。

通过设计REST服务,您会想到开发人员在使用您的API时可能会感到的舒适。 我会说,这是一个舒适的解决方案。

检索用户订单列表的查询是否应该明确?
否: http : //example.com/orders
是: http : //example.com/orders? userid= 1234

放置POST以创建新订单时,JSON是否应包含用户?
否:{orderref:'EXAM / 1',项目:{...}}
是:{userid:1234,orderref:“ EXAM / 1”,项目:{...}}

如果用户仅查询自己的订单,则不应在查询中明确传递用户ID-您应在HTTP标头中传递用户令牌,并且代码应按提供的令牌提取用户ID,并确定授权用户是否有权查看或修改特定用户数据。

如果要让一个用户获取或修改另一个用户数据,则可以设置其他终结点-类似于users/{userId}/ordersusers/{userId}/orders/{orderId} 您仍将通过HTTP标头传递用户令牌,并且您的实现应检查用户是否对此操作具有管理员权限。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM