面向客户端的REST API身份验证

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 的客户端进行更改,而是可以提供标准文档以供我们所有客户端使用。
如果我的表述不够清晰,我将很乐意发布其他详细信息。
1个回答

2
有两种类型的客户端可能需要准备您的API:
- 受信任的客户端-由您编写。它们可以拥有实际用户的用户名和密码,并可以在每个请求中将这些数据发送到您的服务器,可能是在HTTP身份验证标头中。您只需要通过它们建立加密连接即可。
- 第三方客户端-由某些随机开发人员编写。您可以在服务中注册它们并为每个客户端添加唯一的API密钥。此后,如果用户想使用他们的服务,则必须向她显示一个提示,以允许第三方客户端访问。之后,第三方客户端将被分配给该用户带有给定权限的帐户,并获得特定于用户的访问令牌。因此,当客户端发送其API密钥和用户特定令牌以及请求时,它会代表用户发送请求。
OAuth可以帮助您控制第二种情况。
您的URL对客户端没有意义。通过REST,您必须通过发送带有语义注释(例如链接关系)的链接来解耦客户端与URL结构。因此,您的文档不必包含任何关于URL结构的内容(也许它对于服务器端调试可能有用,但更多的是)。您必须讨论不同类型的链接。通过在服务器端生成这些链接,您可以检查实际用户(或第三方客户端)的权限,并跳过她无权跟随的链接。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接