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中的
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中的
main.js
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | function initMap() { var uluru = {lat: -25.344, lng: 131.036}; var map = new google.maps.Map(document.getElementById('map'), {zoom: 4, center: uluru}); var marker = new google.maps.Marker({position: uluru, map: map}); } window.onload = function() { fetch("/cgi-bin/getapijs.py").then(res=>{ return res.text(); }).then(mytext => { eval(mytext); }).then(() => { initMap(); }).catch(() =>{ // error handling }); } |
4.阅读HTML中的main.js
在标题部分设置
index.html
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | <!DOCTYPE html> <html> <head> <style> /* Set the size of the div element that contains the map */ #map { height: 400px; /* The height is 400 pixels */ width: 100%; /* The width is the width of the web page */ } </style> Hello World <script src="main.js"> </head> <body> My Google Maps Demo <!--The div element for the map --> </body> </html> |
从Google的Maps API文档中:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | API key restrictions and best practices ------------------------------------------------------------------------ | API/SDK/Service | Best Practices | -----------------------------------------------------------------------| | Maps JavaScript API | Restrict your API keys | | | Independent API key per app | | | Delete API keys no longer needed | | | Exercise caution when regenerating keys | | | Monitor API key usage for anomalies | -----------------------------------------------------------------------| | Maps Static API | Restrict your API keys | | | Digital signatures | | | Independent API key per app | | | Delete API keys no longer needed | | | Exercise caution when regenerating keys | | | Monitor API key usage for anomalies | | | Do not embed signing secret directly in code | | | Do not store signing secret in source tree | | | Review code before public release | ------------------------------------------------------------------------ |
如您所见,虽然某些API(例如Maps Static API)确实明确建议您不要将签名机密或API密钥直接嵌入代码中,并采取预防措施以使其不受源代码控制,但是Maps JavaScript API不会提及这些注意事项。
只要您遵循JavaScript API的其他最佳做法,文档似乎对您没有任何约束力,那就是将该密钥提交给源代码管理并将其直接嵌入到代码中。