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

Architecture 如何在前端使用API时有效地限制查询API,architecture,api-design,Architecture,Api Design,假设我有一个网站,上面有一张地图,上面显示了不同位置的传感器 我的网站为开发者提供了API,但有限制——每天1000个请求是免费的,如果你想要更多,你必须支付$0.0008/请求。使用信用卡进行验证 然而,我拥有的这个映射使用相同的API来查询数据。如何使API能够区分这两个方面?我希望用户能够在我的网站上看到我地图上的传感器数据,但我不希望其他开发人员在没有使用适当的API的情况下窃取这些数据。很高兴看到您意识到互联网上的每个API都是公共API,因此如果有足够的时间发现其弱点,可能会被滥用

假设我有一个网站,上面有一张地图,上面显示了不同位置的传感器

我的网站为开发者提供了API,但有限制——每天1000个请求是免费的,如果你想要更多,你必须支付$0.0008/请求。使用信用卡进行验证


然而,我拥有的这个映射使用相同的API来查询数据。如何使API能够区分这两个方面?我希望用户能够在我的网站上看到我地图上的传感器数据,但我不希望其他开发人员在没有使用适当的API的情况下窃取这些数据。

很高兴看到您意识到互联网上的每个API都是公共API,因此如果有足够的时间发现其弱点,可能会被滥用

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

想法:跟踪行为。很容易识别调用API的映射的“正常”行为吗?例如,它是每分钟只调用一次API,还是每秒多次调用API?如果正常的,MAP引起的频率低,那么你可以考虑来自开发者的更高的频率,而不是地图用户。 想法:跟踪用户。您网站地图的用户需要登录吗?如果是这样,您可以跟踪每个用户的API调用,并查找对于正常映射使用来说过高的数字

想法:跟踪每个地图显示。浏览器窗口中地图的每次显示都分配了一个唯一的ID,该ID由web服务器包含在生成的网页HTML/JavaScript中。然后,ID随显示的映射的每个API请求一起发送回。在API服务器中,如果ID不在当前显示地图的ID列表中,则API请求将被拒绝。这个概念类似于“”,所以我将其称为映射nonce。直接调用API的开发人员将没有有效的映射,因此他们不能伪装成映射。而且,即使他们拥有来自另一个浏览器或用户的有效映射nonce,它也不会对他们的特定会话有效。如果实现此功能,则必须跟踪处于活动状态的映射nonce。一段时间后,映射nonce应该过期。当用户注销时,该会话的映射nonce将过期。如果映射发出API请求,并且该请求由于其映射nonce而被拒绝,则映射应重新显示,这将导致它从服务器获取新的映射nonce

想法:混淆。将地图和API放在不同的域上。使映射的API不同于开发人员的API(可能是JSON与querystring)。不要(公开)记录地图的API。仅在地图的API中包含地图的基本数据。每隔一段时间更改map的API,以绊倒任何滥用API的开发人员。由于地图用户的大脑能够过滤无意义的视觉数据,因此可以在地图API中包含虚假数据——如果仔细操作,地图用户不会介意


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

很高兴看到你意识到互联网上的每个API都是公共API,因此如果有足够的时间发现其弱点,可能会被滥用

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

想法:跟踪行为。很容易识别调用API的映射的“正常”行为吗?例如,它是每分钟只调用一次API,还是每秒多次调用API?如果正常的,MAP引起的频率低,那么你可以考虑来自开发者的更高的频率,而不是地图用户。 想法:跟踪用户。您网站地图的用户需要登录吗?如果是这样,您可以跟踪每个用户的API调用,并查找对于正常映射使用来说过高的数字

想法:跟踪每个地图显示。浏览器窗口中地图的每次显示都分配了一个唯一的ID,该ID由web服务器包含在生成的网页HTML/JavaScript中。然后,ID随显示的映射的每个API请求一起发送回。在API服务器中,如果ID不在当前显示地图的ID列表中,则API请求将被拒绝。这个概念类似于“”,所以我将其称为映射nonce。直接调用API的开发人员将没有有效的映射,因此他们不能伪装成映射。而且,即使他们拥有来自另一个浏览器或用户的有效映射nonce,它也不会对他们的特定会话有效。如果实现此功能,则必须跟踪处于活动状态的映射nonce。一段时间后,映射nonce应该过期。当用户注销时,该会话的映射nonce将过期。如果映射发出API请求,并且该请求由于其映射nonce而被拒绝,则映射应重新显示,这将导致它从服务器获取新的映射nonce

想法:混淆。将地图和API放在不同的域上。使映射的API不同于开发人员的API(可能是JSON与querystring)。不要(公开)记录地图的API。仅在地图的API中包含地图的基本数据。每隔一段时间更改map的API,以绊倒任何滥用API的开发人员。由于地图用户的大脑能够过滤无意义的视觉数据,因此可以在地图API中包含虚假数据——如果仔细操作,地图用户不会介意

那么,b