如何在前端使用它时有效地限制查询 API

How to effectively make limitations on querying API when your front-end uses it

假设我有一个网站,其地图显示不同位置的传感器。

我的网站为有限制的开发人员提供 API - 1000 requests/day 是免费的,如果你想要更多,你必须支付 0.0008 美元/请求。使用信用卡进行验证。

然而,我拥有的这张地图使用相同的 API 来查询数据。我怎样才能让 API 能够区分这两个东西?我希望用户能够在我的网站上看到我的地图上的传感器数据,但我不希望其他开发人员在不使用正确的 API.

的情况下窃取这些数据

很高兴看到您意识到互联网上的每个 API 都是一个 public API,因此可以被滥用, 有足够的时间来发现它的弱点。

我想解决方案可能包括以下一些想法。遗憾的是,以下每个想法都有弱点,但它们的组合可以充分满足您的要求。您可能永远无法绝对保证解决方案,但您可以非常接近。

想法:跟踪行为。识别调用 API 的映射的 "normal" 行为是否容易?例如,它是每分钟仅调用一次 API 还是每秒调用多次?如果正常的、由地图引起的频率很低,那么您可以考虑更高的频率来自开发人员,而不是地图用户。

想法:跟踪用户。您网站地图的用户是否需要登录?如果是这样,您可以跟踪每个用户的 API 呼叫,并查找对于正常地图使用来说太高的号码。

思路:跟踪每个地图显示。地图在浏览器中的每次显示 window 都分配有一个唯一的 ID,该 ID 由 Web 服务器包含在生成的 HTML/JavaScript 网页中。然后,从显示的地图发出的每个 API 请求都会发回 ID。在API服务器中,如果ID不在当前显示的地图列表中,则API请求被拒绝。这个概念类似于“nonce”,所以我将其称为map-nonce。直接调用 API 的开发人员将没有有效的 map-nonce,因此他们无法伪装成地图。而且,即使他们从另一个浏览器或用户那里获得了有效的 map-nonce,它也不会对他们的特定会话有效。如果你实现这个,你将不得不跟踪活跃的 map-nonce。一段时间后,map-nonce 应该会过期。当用户注销时,该会话的 map-nonce 已过期。如果地图发出 API 请求,并且请求由于其 map-nonce 而被拒绝,则地图应重新显示,这将导致它从服务器获取新的 map-nonce。

想法:混淆。将地图和 API 放在不同的域中。使地图的 API 不同于开发者的 API(可能 JSONquerystring)。不要(publicly)记录地图的 API。仅在地图 API 中包含地图的基本数据。每隔一段时间更改地图的 API,以阻止任何滥用职权的开发人员。由于地图用户的大脑会过滤无意义的视觉数据,因此您可以在地图中包含虚假数据 API -- 如果做得仔细,地图用户不会介意。

因此,通过识别用户和地图显示,然后考虑他们的 API 行为,您应该能够合理地确定是否有人在滥用您的 API。当然,你可以打赌有人会找到破解它的方法,所以你应该保留统计数据,并记得定期调动你的大脑和眼球。

如果您正在使用像 APIGEE 这样的 API 网关,那么您可以选择应用基于源 ip 的策略。如果请求的源 IP 是您的服务器(网站),则不要应用任何限制策略,否则应用限制策略。

我知道你已经接受了一个答案,但我想加入一些其他的东西。

首先,如果您有免费层和付费层,您实际上并没有处理两种情况——您仍在迎合开发人员的需求,您需要跟踪他们的使用情况。区别只是请求的数量。如果您允许 public(匿名)访问,您只有两种情况,如果您允许 public 访问,则无论您尝试添加多少棘手的跟踪技术,您都无法可靠地跟踪使用情况.

您应该首先确保所有 API 消费者(开发人员)都已注册并且必须向您的 API 进行身份验证(查看 OAuth 2.0,只有在您有充分的理由这样做)。

由于多种原因,IP 跟踪并不可靠。首先,它可以被欺骗,所以有人基本上可以在每个请求中注入一个任意的 IP 地址,这样它就不会看起来像是来自同一个地方。其次,任何防火墙后面的人(例如在一个组织内)可能看起来都在使用相同的 IP 地址——这可能与您的目标市场相关,也可能不相关,但我只是说。

因此,按照 Virgo_The_Perfectionist 的建议,您最好的方法是使用可以为您执行此操作的 API 网关。您应该寻找具有以下内容的内容:

  • 开发者门户(最好同时支持开发者自助注册和某种支付机制/货币化功能)
  • 能够设置根据使用情况规定等级和定价的计划
  • OAuth 2.0 支持身份验证
  • SLA 策略可以执行诸如速率限制、节流等操作。

你当然可以 "roll your own" API 网关,但你将重新发明轮子,这在经济上或努力方面可能不值得:取决于有多少开发人员和 API 呼叫您正在维修的整体。许多网关提供免费试用,因此您可以在没有经济损失的情况下开始,然后您可能会为较低的计划寻找每月 50 美元以上的费用,更多的开发人员和 API 电话。

您还可以通过商业 API 网关获得指标和报告,因此您可以实际直观地了解谁在使用什么以及如何使用,如果您正在改进和改进您的产品,这将是无价的。

希望对您有所帮助。