在 Flutter 中限制 Google Directions API 密钥

Posted

技术标签:

【中文标题】在 Flutter 中限制 Google Directions API 密钥【英文标题】:Restrict Google Directions API key in Flutter 【发布时间】:2019-10-18 07:03:13 【问题描述】:

我一直在使用 Flutter 开发一个移动应用,并希望尽快在 Play 商店中发布它。它使用 Google Directions API,现在我想将 API 密钥限制在此特定应用程序中。

我能够对应用进行签名,并且我已使用我的应用的包名称和密钥的 SH1A 指纹将 API 密钥限制为 android 应用,这两项都经过了双重检查。

无论是在调试模式(我认为这是故意的)还是在发布模式下,请求都会被拒绝。 我通过 dart HTTP 包访问 API。

我的理论是这样一来,Directions API 无法识别应用程序的包名称或指纹。那是对的吗?我可以改用 google_maps_webview 包或其他东西来解决这个问题吗?

提前致谢,

保罗

【问题讨论】:

【参考方案1】:

问题在于Directions API 是一项网络服务。 Google 假设 Web 服务是从后端代码调用的,而不是直接从前端调用的。因此,Directions API、Geocoding API 等 Web 服务支持的唯一限制是 IP 地址限制。假设您从后端服务器向 Google 发送请求,并通过服务器的 IP 地址保护您的 API 密钥。 Android 应用限制不适用于网络服务。

您可以在此处阅读每个 API 支持的限制类型: Which keys or credentials should I use for different Maps products?

对于移动应用程序,Google 强烈建议为 HTTP 网络服务请求创建一个中间服务器。因此,您的应用程序将向中间服务器发送请求,中间服务器将使用受 IP 地址保护的 API 密钥的 Directions API 请求发送给 Google,并将响应返回给您的应用程序。

我可以建议为 Google Maps API Web Services 使用 Java 客户端库来实现中间代理:

https://github.com/googlemaps/google-maps-services-java

还有可用于其他后端语言(Python、Go、NodeJs)的客户端库:

https://github.com/googlemaps/google-maps-services-python

https://github.com/googlemaps/google-maps-services-go

https://github.com/googlemaps/google-maps-services-js

希望我的回答能澄清你的疑惑。

【讨论】:

非常感谢您的详细解释!该应用已使用自定义 REST API,因此我将在其中添加 Directions API 但是如果我的应用不使用 REST Api,那我怎么能在那里整合方向。 如果有人知道对中间代理的 REST 请求格式,那么任何人都可以滥用它,对吧? 我像使用 dio 包的休息请求一样使用它。但我的错误百分比非常高(70%),我得到的路线信息是空的......可能是什么问题? @VishnuHaridas

以上是关于在 Flutter 中限制 Google Directions API 密钥的主要内容,如果未能解决你的问题,请参考以下文章

在flutter中使用google auth的逻辑(一个用户只能从一个gmail和同一设备登录)?

如何在 Flutter 中限制谷歌地图的边界?

即使在 Flutter 中使用正确的 SHA1 密钥,Google 地图也无法在发布版本中工作

应用运行时 Flutter Google Map API 问题

Flutter :: 如何在showTimePicker中限制时间?

在 Flutter 中限制登录尝试?