6

我看过很多关于验证 RESTful API 的不同解决方案的不同帖子,鉴于当前的情况,我有一些问题。

我已经构建了一个 REST API,它将允许我的软件服务的客户(我们是一家 B2B 公司)以编程方式访问资源。现在我已经让 API 正常工作,我想以最标准化的方式保护它。我需要根据 API 的调用者允许访问某些资源。也就是说,并非所有 API 的用户都可以访问所有资源。

我有以下格式的 URL:

https://mydomain/api/students
https://mydomain/api/students/s123
https://mydomain/api/students/s123/classes
https://mydomain/api/students/s123/classes/c456

到目前为止,我已经提出了这些可能的解决方案:

  1. 为每个客户端提供一个唯一密钥,他们可以使用该密钥最终生成一个加密令牌,该令牌将在每个 REST 调用结束时作为 GET 参数传递,以(重新)验证每个请求。这种方法是否太昂贵

    https://mydomain.com/api/students/s123?token=abc123

  2. 在 HTTP 授权标头中提供一个值,如此处所示。这和#1几乎一样吗?(除了我无法将 URL 粘贴到浏览器中)人们不再使用这些标题了吗?

  3. 使用 OAuth 2(我还不清楚)。OAuth 2 是否真的将客户端验证为登录用户?这难道不违背 REST API 无状态的精神吗?我希望 OAuth 对我来说是正确的解决方案(因为它是一个公共标准),但是在阅读了一点之后,我不太确定。REST API 调用是否矫枉过正和/或不当?

我的目标是提供一个不需要为每个想要使用该 API 的客户更改的 API,而是我可以提供一个标准文档,供我们所有的客户使用。

如果我不清楚,我很乐意发布更多细节。

4

1 回答 1

2

您可能要准备 API 的客户端有 2 种类型:

  • 受信任的客户 - 由您编写。他们可以拥有实际用户的用户名和密码,并且可以在每次请求时将该数据发送到您的服务器,可能在 HTTP auth 标头中。您所需要的只是他们的加密连接。

  • 3rd 方客户端 - 由一些随机开发人员编写。您可以在您的服务中注册它们并为它们中的每一个添加一个唯一的 API 密钥。之后,如果用户想要使用他们的服务,您必须向她显示一个提示,在该提示中她可以允许访问第 3 方客户端。之后,第三方客户端将被分配给具有给定权限的用户帐户,并将获得用户特定的访问令牌。因此,当客户端将其 API 密钥和用户特定令牌与请求一起发送时,它会以用户的名义发送请求。

OAuth 可以帮助您控制第二种情况。

您的 URL 对客户没有任何意义。通过 REST,您必须通过发送带有语义注释的链接(例如链接关系)来将客户端与 URL 结构分离。因此,您的文档不必包含有关 URL 结构的任何内容(也许它对服务器端调试很有用,但仅此而已)。你必须谈论不同类型的链接。通过在服务器端生成这些链接,您可以检查实际用户(或第三方客户端)的权限并跳过她无权关注的链接。

于 2013-12-01T15:30:32.130 回答