如何保护REST API调用?

我正在开发在后端使用一些stream行的web框架的restful web应用程序,比如(rails,sinatra,flask,express.js)。 理想情况下,我想用Backbone.js开发客户端。 我如何只让我的JavaScript客户端与这些API调用进行交互? 我不希望这些API调用是公开的,并通过curl调用,或者只是通过在浏览器中input链接。

作为第一个原则,如果你的API被你的JS客户端所使用,你必须假设它是公开的:一个简单的JSdebugging器将攻击者放到一个位置,在那里他可以发送一个字节对于一个字节相同的请求他select的工具。

也就是说,如果我正确地阅读了你的问题,这不是,你想要避免的是:你真正不想要发生的事情是,你的API被消费(定期),而不涉及你的JS客户端。 这里有一些关于如何执行的想法,那么至less鼓励使用你的客户:

  • 我相信,你的API有一些authentication领域(例如在客户端计算的哈希)。 如果没有,看看这个SO问题 。 确保你使用一个salt(或者甚至是API key),这个key是在会话的基础上给你的JS客户端(非硬编码的)。 这样,您的API的未经授权的消费者被迫进行更多的工作。

  • 在加载JS客户端时,记住一些HTTP标头(用户代理想到的)和IP地址,并要求重新authentication,如果他们改变了,使用通常的嫌疑犯黑名单。 这迫使攻击者再次彻底做功课。

  • 在服务器端,请记住最后几个API调用,在允许另一个API调用之前,请检查业务逻辑是否允许新的API访问:这会拒绝攻击者将他的许多会话集中到与服务器的一个会话中:In与其他措施相结合,这将使施虐者容易察觉。

我可能没有说清楚这一点:我认为不可能让虐待者完全不可能使用你的服务,但是你可以使它变得如此艰难,这可能不值得一提。

你应该实现某种authentication系统。 处理这个问题的一个好方法是定义一些预期的头部variables。 例如,可以有一个auth / login API调用返回一个会话标记。 随后对您的API的调用将会期待一个会话标记被设置在一个HTTP标头variables中,并且具有特定的名字,比如'your-api-token'。

或者,许多系统使用某种types的API帐户系统创build预期的访问令牌或密钥(如youtube,facebook或twitter)。 在这些情况下,您的客户必须以某种方式将其存储在客户端。

然后,只需将会话的检查添加到REST框架中,然后抛出exception即可。 如果所有可能的状态代码(安静)将是一个401错误。

有一个名为“JSON Web Token”的开放标准,

请参阅https://jwt.io/和https://en.wikipedia.org/wiki/JSON_Web_Token

JSON Web Token(JWT)是一种基于JSON的开放标准(RFC 7519),用于创build声明一定数量声明的令牌。 例如,一台服务器可能会生成一个令牌,声称“以pipe理员身份login”并将其提供给客户端。 客户端然后可以使用该标记来certificate他们以pipe理员身份login。 令牌由服务器密钥签名,因此服务器能够validation令牌是否合法。 令牌被devise成紧凑的,URL安全的并且尤其在web浏览器单点login(SSO)上下文中可用。 JWT声明通常可用于传递身份提供者和服务提供者之间的身份validation用户的身份,或业务stream程所要求的任何其他types的声明[1] [2]。 令牌也可以被authentication和encryption。[3] [4]

请问@MarkAmery和Eugene,但这是不正确的。

您在浏览器中运行的js + html(客户端)应用程序可以设置为排除对API的未经授权的直接调用,如下所示:

  1. 第一步:设置API以要求authentication。 客户端必须首先通过服务器(或其他安全服务器)进行身份validation,例如要求用户提供正确的密码。

在authentication之前,不接受对API的调用。

在authentication过程中,返回“令牌”。

authentication之后,只有具有authentication“令牌”的API调用才会被接受。

当然,在这个阶段,只有拥有密码的授权用户才能访问API,尽pipe如果他们是debugging应用程序的程序员,他们可以直接访问它来进行testing。

  1. 第二步:现在build立一个额外的安全API,这将在最初从服务器请求客户端js + html应用程序之后的短时间内被调用。 这个“callback”会告诉服务器客户端已经下载成功。 限制您的REST API调用仅在最近成功请求客户端时才起作用。

现在为了使用你的API,他们必须先下载客户端,然后在浏览器中运行它。 只有在成功接收callback,然后在短时间内进行用户input后,API才能接受呼叫。

所以你不必担心这可能是没有证书的未经授权的用户。

(问题的标题是“如何保护REST API调用”,以及大部分的说法,这是您最关心的问题,而不是您如何调用API的字面问题,而不是由谁来调整? )