使用 google maps js API 时是否需要隐藏 API 密钥?如果是这样,如何?

IT技术 javascript html google-maps google-maps-api-3
2021-02-20 09:48:36

根据https://developers.google.com/maps/documentation/javascript/tutorial#HTML5,似乎我可以将以下标签添加到我的 html 并开始使用 maps js API。

<script async defer
      src="https://maps.googleapis.com/maps/api/js?key=YOUR_API_KEY&callback=initMap">
</script>

但这会显示我的 API 密钥。

在google上搜索,在stackoverflow上浏览答案后,我觉得可能没有必要隐藏这个API key。我只需要在 google 上创建 API 密钥时设置引用者,如 https://stackoverflow.com/a/2256312/1316649 中所述

因此,即使其他人知道我的 API 密钥,他们也无法从其他域使用它。我对吗?

但谷歌说你不应该在代码中嵌入 API 密钥:https : //support.google.com/cloud/answer/6310037

那么,在使用 google maps js API 时是否需要隐藏 API 密钥?如果是这样,如何?

更新:“API 密钥”是指浏览器 API 密钥。

6个回答

您可以创建多个具有不同限制的 API 密钥以安全使用它们。对于嵌入地图,Google Maps 文档在获取 API 密钥 - 限制 API 密钥中提供了创建正确受限 API 密钥的说明,以便它不会被滥用用于其他目的在源代码中包含受限 API 密钥是可以的,因为不这样做就无法正确嵌入地图。

如果您需要服务器端 API 访问权限,您可以创建第二个限制较少的 API 密钥。那个应该保密。

Google 不再区分密钥类型,所有密钥都提供所有安全选项(截至 2020 年 11 月撰写时)。请参阅cloud.google.com/docs/authentication/api-keys
2021-04-21 09:48:36
谢谢你的回答!我在询问浏览器密钥。我会更新问题。
2021-05-08 09:48:36
有一个通过 javascript 进行地理定位的 API。它假设是隐藏的,因为它在教程中说明了,所以我做了一个功能只是为了让它静默运行 - 但它总是相同的键!关于这些键的信息在 Google Dev 中不清楚,感谢您的澄清!
2021-05-18 09:48:36
@sirlark 谢谢。我已经更新了答案以反映现在的工作方式。
2021-05-20 09:48:36

虽然上述答案很有帮助,但它们都没有解决以下漏洞:

一旦用户可以访问您的 API 密钥,即使他们被限制只能在您的域中使用它,他们仍然可以随心所欲地使用它。在最粗略的意义上,这可能意味着在很短的时间内刷新一百万个页面(和地图加载),从而使您超出使用配额。

我还没有遇到任何解决此问题的解决方案。除非我遗漏了什么……?

谷歌地图 javascript api 的相关使用限制在这里。

您可以限制 API 密钥。您的配额不会受到影响。
2021-04-20 09:48:36
如果没有某种自己的后端实现来限制锤击,我认为对此无能为力。
2021-04-25 09:48:36
我在投票是因为我正在搜索讨论恶意用户用尽配额问题的帖子,但我认为这并没有真正试图回答这个问题。
2021-05-04 09:48:36
这是我需要解决的问题
2021-05-13 09:48:36
假设您在可以访问网关/反向代理/入口等的基础设施上,您始终可以使用速率限制器。甚至可以通过一点创造力和可能的无服务器功能来创建自己的。
2021-05-13 09:48:36

您发布的链接说您不应在代码中嵌入 API 密钥与 Google 的云平台有关。您可以在代码中保留 Google 地图的 API 密钥。

不确定这个答案是否非常有用,因为 Google Cloud Platform 是您首先获取 Maps API 密钥的地方。请参阅developers.google.com/maps/documentation/javascript/get-api-key
2021-05-10 09:48:36

我建议将您的 API 密钥限制为仅由需要它们的 IP 地址和引用 URL 使用:通过限制 IP 地址、引用 URL,您可以减少受损 API 密钥的影响。

您可以通过打开凭据页面,然后使用所需的设置创建新的 API 密钥或编辑 API 密钥的设置,从控制台指定可以使用每个密钥的主机和应用程序。

这应该可以帮助您保护 API 密钥。

杰夫

限制引用绝对没有任何作用,任何人都可以欺骗它。并且无法对联系页面等公共页面进行 IP 限制,因为您无法列出所有访问者的 IP。
2021-05-03 09:48:36

隐藏任何服务的 API 密钥:

  1. 设计一个 Web 服务器,该服务器将接受对第三方服务的请求并向它们代理请求。
  2. 设计您的界面以向您在步骤 1 中设计的 Web 服务器发出请求。
  3. 将密钥存储在您在步骤 1 中构建的 Web 服务器上,并将身份验证、授权和速率限制应用于第 3 方代理请求。

您使用的第 3 方库可能会强制您使用某些主机或可能会强制您包含 API 密钥。对于第一个问题,您必须编辑他们的库代码,或者为 3rd 方客户端库提供不同的 http 请求库,例如fetch()在 javascript 中重新定义函数。对于第二个问题,只需添加一个垃圾密钥,您的代理服务器可以忽略它并用真正的密钥重写它。

好处:
  • 隐藏你的钥匙。
  • 跟踪请求和响应的对象、内容和时间。你可以用其他方式做到这一点。
  • 可以向服务添加一层缓存,以加快其他用户之前提出的请求,前提是他们的服务条款允许。
注意事项:
  1. 因为用户会冒充您的服务器发出请求,所以您正在接受安全风险。如果用户故意发出恶意格式的请求,他们会假装是您的服务器。但是,如果您想稍后对其进行审核,您可以记录所有请求。
  2. 构建和配置具有您需要的所有安全性的代理服务器需要几秒钟的时间。
  3. 您现在需要处理所有这些可能会产生大量流量的 Web 请求。
  4. 您可能希望拦截服务器返回的响应,以防它在错误或其他情况下返回响应正文中的键。
  5. 您正在链中添加另一个链接,这会使服务的可靠性稍差。
提及

我想提一下,这基本上是“@OLTO 和 SUGI-cube 项目”试图在他们的回答中展示的内容,以及 #Brandon Miller 在评论中建议作为解决方案的内容。