问题描述
背景:
-
我正在使用谷歌自己的 custom search JSON API 在我们的平台上启用谷歌搜索。
寻找可能的解决方案:
- 当用户登录平台网站时,从池中向前端逻辑提供一个有效的密钥(请注意,用户可能使用也可能不使用嵌入式谷歌搜索,但前端应始终拥有一个有效的密钥,以防万一用户执行嵌入式谷歌搜索)。
- 跟踪
API
密钥的使用次数,以了解密钥何时用完其配额。 - 使用什么样的存储来存储这些密钥?
- 对租户或用户启用“速率限制”,以便每个人都能公平地分享可用呼叫总数。
解决方法
首先,从安全角度来看,这种通过访问 API 密钥直接调用外部 API 的 UI 想法对我来说并不好。在调用外部 API 之前,我仍会考虑使用薄后端层来验证请求。
现在对于您的问题,Google API 已经有monitor API usage 的方法,这是我首先要考虑的,因为根据您的应用程序的规模,跟踪 API 使用情况可能难以管理.
您还可以设置 API usage per user 的上限,以确保您不会达到 10K 的限制,这实际上是您要寻找的 - 如果用户达到分配的配额,则对用户进行速率限制。据我所知,这适用于某些 Google API,需要检查一下它是否也适用于搜索 API。
现在,如果您有充分的理由自己动手,您可以将键存储在快速的 No-SQL 缓存中,例如 Redis。它可能需要一些自定义逻辑来始终为您提供调用次数最少的 API 密钥,但这可以确定。
可以使用 Bucket4J 或类似的库进行速率限制。