API端点是否根据用户凭据RESTful和良好的URI设计来区分要返回的资源?

Vis*_*per 17 authentication rest uri api-design restful-url

重要的提示

这个问题的焦点在于API端点,它根据谁进行身份验证来区分返回哪些资源,例如Alice获得资源A和B返回,Bob获取资源X和Y.

不是要区分返回的资源的表示.

所有端点都返回资源的JSON表示.

前言

请考虑以下三种潜在的API端点设计,即所有返回thing用户的资源.

终点A.

GET /things
Run Code Online (Sandbox Code Playgroud)

如果<user_x>请求提供了身份验证凭据,则会返回与其具体相关的thing资源.例如,验证用户Alice获得资源A和B返回,并且验证用户Bob获取资源X和Y.<user_x>

因此,不同验证用户的响应的区别在于返回哪些资源实例,而不是返回这些实例的哪些信息(即资源表示).

身份验证失败时,将返回401响应.

终点B.

GET /user/<user_x>/things
Run Code Online (Sandbox Code Playgroud)

终点C.

GET /things/?user_id=<user_x>
Run Code Online (Sandbox Code Playgroud)

如果验证用户有权访问这些资源,端点B和C都提供thing与之相关的资源实例.<user_x>thing

thing返回的资源实例的表示(例如,返回关于资源的哪些信息)可以根据哪个用户进行认证而变化.例如,<user_x>或者管理员用户可能会获得每个资源实例更丰富的数据,然后获得具有有限访问权限的用户.

验证对thing资源没有任何访问权限的用户<user_x>将获得401响应.

我的问题

我想回答以下问题:

1)端点是RESTful吗?

2)端点A是否具有良好的URI设计?

3)端点B和C是否RESTful?

4)端点B和C是否具有良好的URI设计?

我很期待你的回答.我也在下面提供了自己的答案,并对此也提供反馈表示感谢.

谢谢!

- 弗雷迪斯奈德

Vis*_*per 8

更新2015年3月18日13:05 CET在所提问题的评论中包含反馈意见.

RESTfulness

从纯粹主义的角度来看,端点的非RESTful.例如,该问题没有说明响应是否包含到资源的链接,使得客户端可以检索资源而无需知道如何构造资源的URI.实际上,正如本博文中所指出的,在实践中几乎没有定义的API,除了万维网本身之外,可以被认为是RESTful.

那么关于这些端点没有什么用处吗?我觉得有.我们可以讨论处理端点的无状态和一致性,这对可伸缩性很重要.我们可以谈论对安全性很重要的端点安全性.

对于所有端点,您可以声明以下内容:

它是无国籍的吗?

是的,用户身份验证凭据是应用程序状态的一部分,并随每个请求一起发送,因此服务器需要知道处理请求而不保留状态的所有内容都在请求中.(完整的州转移)

由于这些端点处理GET请求,它们是否具有同等效力?

端点A):是的,因为对端点A的请求(包括用户身份验证凭据)应该被视为一个整体:无论您使用相同凭据重复相同请求的频率如何,您始终都会获得thing用于身份验证的资源用户.

但是,如果您只考虑URI,则该请求实际上不是idem有效的,因为响应会根据提供的凭据而更改.

端点B)和C):与A)类似,无论您多久重复一次,您都将始终获得URI thing<user_x>提供的资源.

最重要的是,请求也只是在考虑URI本身时才是有意义的,您需要知道的有关请求的所有内容都在URI中,用户凭据只能更改返回thing资源的表示形式,而不能返回返回的资源.

由于这些端点处理GET请求,它们是否安全?

是的,因为请求不会改变任何数据,也没有任何其他副作用.

URI设计

虽然从纯粹的REST角度来看,URI设计被认为是无关紧要的,但在实际情况下,软件开发人员和API最终用户使用和处理URI设计是相关的.

端点A是否具有良好的URI设计?

是和否.当这个URI对应用程序用户隐藏时,这不会被加入书签或共享,这样设计就可以了.但是,当此URI向最终用户公开时,此URI设计得不好,因为当将其作为链接共享时,除非她作为同一用户进行身份验证,否则收件人将看不到相同的数据.

端点B和C有一个很好的URI设计吗?

是的,最终用户可以在语义上理解端点的含义,并且URI可以在用户之间共享.

因此,您可以选择仅定义端点B和C,而不是定义所有三个端点,因为它们可以提供端点A可以提供的所有内容,而且从URL可以明显看出所请求的内容.

请让我知道你在想什么.谢谢!

- 弗雷迪斯奈德