使用谷歌地图js API时是否需要隐藏API密钥?如果是这样,怎么样?

fst*_*ang 21 html javascript google-maps google-maps-api-3

根据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>
Run Code Online (Sandbox Code Playgroud)

但这将揭示我的API密钥.

在google上搜索并在stackoverflow上浏览答案后,我觉得可能没有必要隐藏此API密钥.我只需要在谷歌上创建API密钥时设置引用,如 /sf/answers/157941871/中所述

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

但Google表示您不应在代码中嵌入API密钥:https: //support.google.com/cloud/answer/6310037

那么,在使用谷歌地图js API时是否需要隐藏API密钥?如果是这样,怎么样?

更新:通过'API密钥',我的意思是浏览器API密钥.

Mat*_*nen 12

Google地图有多种类型的API密钥.有嵌入客户端库的浏览器密钥,可以向人们展示(你需要在客户端使用它,所以你无论如何都无法避免).然后是服务器端密钥,用于诸如地理编码服务之类的事情.应该保密.

只需确保您使用的是浏览器密钥.


Mur*_*ago 7

尽管以上回答很有帮助,但它们都没有解决以下漏洞:

一旦用户可以访问您的API密钥,即使仅限于仅在您的域中使用它,他们仍然可以随意使用它。从最粗略的意义上讲,这可能意味着在非常短的时间内刷新一百万页(并加载地图),因此使您超出了使用配额。

我还没有遇到任何解决此问题的解决方案。除非我错过了什么...?

此处有关Google Maps JavaScript API的相关使用限制。

  • 这是我需要解决的问题 (3认同)
  • 这可能会有所帮助&gt; [Maps JavaScript API 使用和计费 | Google Developers](https://developers.google.com/maps/documentation/javascript/usage-and-billing#set-caps) 您可以通过 3 种方式限制请求数量。1. 每天的地图加载量 2. 每分钟的地图加载量 3. 每个用户每分钟的地图加载量 (3认同)
  • 我在投票是因为我正在搜索讨论恶意用户用尽配额问题的帖子,但我认为这并没有真正试图回答这个问题。 (2认同)
  • 您可以限制每个 ip 每 100 秒或每天的配额 - https://www.youtube.com/watch?v=A8bsgHUYsq8 (2认同)

adj*_*nks 7

要隐藏任何服务的 API 密钥:

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

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

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

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


Che*_*ock 5

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

  • 不确定这个答案是否非常有帮助,因为 Google Cloud Platform 是您首先获取 Maps API 密钥的地方。请参阅 https://developers.google.com/maps/documentation/javascript/get-api-key (2认同)