客户端面临REST API身份验证

时间:2013-02-05 16:01:02

标签: rest restful-authentication

关于验证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授权标头中提供一个值,如here所示。这跟#1几乎一样吗? (除非我无法将URL粘贴到浏览器中)人们是否再次使用这些标题?

  3. 使用OAuth 2(我还有点不清楚)。 OAuth 2实际上是以登录用户身份验证客户端吗?这不违反REST API无状态的精神吗?我希望OAuth对我来说是合适的解决方案(因为它是一个公共标准),但在阅读了一点之后,我不太确定。 REST API调用是否过度和/或不正确?

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

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

1 个答案:

答案 0 :(得分:1)

您可能希望准备两种类型的客户端:

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

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

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

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