关于javascript:使用Google Maps js API时需要隐藏API密钥吗? 如果是这样,怎么办?

Do I need to hide API key when using google maps js API? If so, how?

根据https://developers.google.com/maps/documentation/javascript/tutorial#HTML5,
看来我可以将以下标记添加到html中,然后开始使用maps js API。

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

但这会显示我的API密钥。

在Google上搜索并浏览关于stackoverflow的答案之后,我觉得也许不需要隐藏此API密钥。 我只需要在Google上创建API密钥时设置引荐来源网址,具体说明如下
https://stackoverflow.com/a/2256312/1316649

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

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

因此,使用Google Maps js API时需要隐藏API密钥吗? 如果是这样,怎么办?

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


Google Maps有多种类型的API密钥。有浏览器键,在嵌入客户端库时将使用,并且可以向人们公开(您需要在客户端上使用它,所以无论如何都不能避免)。然后是用于诸如地理编码服务之类的服务器端密钥。这些应该保密。

只要确保您使用的是浏览器密钥即可。


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

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

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

有关Google Maps JavaScript API的相关使用限制,请点击此处。


您发布的链接说您不应在代码中嵌入API密钥,该链接与Google的Cloud Platform相关。您可以在代码中保留Google Maps的API密钥。


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

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

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

杰夫


您需要隐藏API密钥

使用Google Maps js API时,您需要隐藏API密钥。设置引用者是不够的。
我的PC上有本地Web服务器,并且可以更改我的hosts文件,因此我可以将HTML的域名欺骗为您的域。
如果您在HTML中显示API密钥,则有人可能会使用该密钥访问Google地图。这可能意味着刷新一百万页(并加载了地图)!

这是来自Google的不好的例子。

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

如何从HTML隐藏API密钥

我使用环境变量和CGI从HTML隐藏我的API密钥,如下所示。

1.设置环境变量

我在环境变量中设置了Google Maps API密钥,并将其传递给我的CGI脚本。
nginx + fcgiwrap在我的服务器上运行,因此我在fcgiwrap.conf中这样设置API密钥。

fcgiwrap.conf

1
2
3
4
location /cgi-bin/ {
    ........
    fastcgi_param GOOGLE_MAPS_API_KEY  YOUR_API_KEY; <= SET YOUR API KEY HERE
}

2.制作CGI脚本

我这样制作了python CGI。这与Google的SAMPLE中的src="https://maps.googleapis.com/maps/api/js?key=YOUR_API_KEY相同。

getapijs.py

1
2
3
4
5
6
7
8
9
10
11
#!/usr/bin/python
# -*- coding: utf-8 -*-
import requests
import os
url = 'https://maps.googleapis.com/maps/api/js'
key = os.environ['GOOGLE_MAPS_API_KEY'] # get Environment Variables
mysrc = url +"?key=" + key
response = requests.get(mysrc) # get src from Google Maps url
print("'Content-Type': 'text/javascript; charset=UTF-8'") # header for HTML
print("")
print(response.text)

3.从javascript调用CGI

从window.onload调用您的CGI。这与Google的SAMPLE中的

只要您遵循JavaScript API的其他最佳做法,文档似乎对您没有任何约束力,那就是将该密钥提交给源代码管理并将其直接嵌入到代码中。