保护将由不同客户端访问的REST API

时间:2014-06-11 02:20:28

标签: api rest

我开发了一个REST / JSON API。 API公开了许多功能。 API将由我们内部设计的应用程序(移动应用程序和Web应用程序),由我们的经销商设计的应用程序以及由企业设计的应用程序使用。我期待通过实现身份验证和授权来保护应用程序。我已经“搜索”了很多,但我的研究给我留下的问题多于答案。

我们的内部应用程序将由在应用程序上注册的最终用户使用。本质上,我们的应用程序只是一个客户端从最终用户请求,将其带到REST API并为最终用户检索数据。我们的内部应用程序应该能够执行REST API公开的所有操作。在我们的内部应用程序上处理用户登录的最佳方法是什么?基于SSL或OAuth的HTTP Basic?

我们的转销商应用程序可以像拥有用户一样创建用户,但最终用户详细信息会存储在我们的数据库中。经销商应用程序将充当客户端接收用户请求并获取用户数据。我们的代理商应用程序应仅限于REST API的某些操作。我将使用什么安全机制来实现这种授权和用户登录?

我希望我的问题很明确。谢谢你的帮助。

1 个答案:

答案 0 :(得分:2)

根据我在阅读本文时的理解,您的问题分为两部分:

我的API的最佳身份验证方法是什么?

我最近为一个API建立了一个身份验证系统,该系统是在OAuth上建模的,但没有一个规范。该系统与亚马逊用于其API的系统基本相同。如果您需要安全的API身份验证模型而不必使用OAuth,则This article 非常非常有用。

该模型使用以下原则:

  • 身份验证数据将随每次请求一起传递给API服务器
  • 请求将包括生成时的Unix时间戳
  • 整个请求(包括时间戳)将生成HMAC哈希并与其余数据一起发送。哈希是使用只有API服务器和API客户端知道的私钥生成的。
  • API获取数据(包括时间戳),使用该用户的私钥(由用户ID,用户名,公共API密钥等标识)生成HMAC哈希值,并将其与发送的哈希值进行比较。请求。如果成功,则继续进行常规身份验证并处理请求。 注意: API将检查时间戳并将其与自己的时间戳进行比较,以确保请求在有效时间范围内发生,例如30秒,5分钟,10分钟等。

当然,您也可以通过SSL / HTTPS使用常规HTTP身份验证,但我发现这种方式非常好,因为您无需实现every aspect of the OAuth协议即可实现高级别的安全性。

您的身份验证基本上取决于您。我更喜欢采用大型,值得信赖的组织(如亚马逊)采用的方法。我个人不想像Twitter,Facebook等那样使用OAuth。

我应该如何允许不同的用户访问我的API中的不同端点?

您的API服务器中应该有一个内部地图,其中包含允许或拒绝特定API帐户访问某些端点的记录。在我的API服务器中,我决定默认情况下所有端点都是“允许”,我会指定哪些帐户能够访问某些端点。

您还可以设置不同的组或类型的API访问帐户,这些帐户可以具有此类组权限。


我的建议是read this article两次或三次,然后再读一遍。然后,实现其中建议的方法。

就个人而言,我认为确保尽可能多的安全性的最佳方法是将与请求完全相关的所有内容限制在定义的一组边界内,例如:我希望端点只能被GET HTTP请求访问(所有其他HTTP方法都会抛出错误),每个帐户每天最多3次,在30秒的服务器请求时间范围内,只允许要返回的数据范围很窄等等。

限制HTTP方法对于降低API不应该做的事情非常重要,特别是对于RESTful API,因为端点可以用来根据请求方法执行多项操作。您甚至可以为每个API帐户设置权限,以限制每个端点上的某些方法,例如: API用户xxx可以从端点获取信息,但不能POST,PUT,PATCH等,或者API用户xxx2可以POST数据但不能获取任何等等。