2013-02-05 38 views
5

我已经看到许多关于不同解决方案的不同文章,用于验证RESTful API,并且在当前情况下我有一些问题。面向REST API身份验证的客户端

我已经构建了一个REST API,允许我的软件服务(我们是B2B公司)的客户以编程方式访问资源。现在我已经可以正常使用API​​了,我想以最标准的方式保证它的安全。我需要允许基于API的调用者访问某些资源。也就是说,并非所有API的用户都可以访问所有资源。

我提供网址的格式如下:

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. 所看到here提供的HTTP认证头的值。这与#1几乎相同吗? (除了我无法将URL粘贴到浏览器中)人们是否再使用这些标头?

  3. 使用OAuth 2(我仍然有点不清楚)。 OAuth 2是否实际将客户端认证为登录用户?这不符合REST API无国界的精神吗?我希望OAuth对我来说是合适的解决方案(因为它是一个公共标准),但在阅读了一点之后,我不太确定。对于REST API调用它是否过度和/或不适当?

我的目标是提供不必更改为希望来使用API​​的每个客户端的API,而是我可以提供提供给所有客户的标准文档。

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

回答

1

有2个类型的客户,你可能要准备API:

  • 信任的客户 - 这是由你而写的。他们可以拥有实际用户的用户名和密码,并且可以使用每个请求将该数据发送到服务器,可能位于HTTP身份验证标头中。所有你需要的是他们加密的连接。

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

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

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