gpt4 book ai didi

android - 如何正确限制对 Android 和 iOS 应用程序(用 Flutter 编写)的 Google map (地点、地理编码)API 调用?

转载 作者:行者123 更新时间:2023-12-03 23:43:38 26 4
gpt4 key购买 nike

我有一个用 Flutter 编写的移动应用程序。我正在为 Places 和 Geocoding 调用 Google API。由于对这些服务的调用是通过在 url 中包含 key 来进行的,因此限制这些 key 非常重要,这样任何人都不能只是拦截并使用它们进行多次调用并为我们在 Google 上建立一个大帐户。
API 调用示例如下:
https://maps.googleapis.com/maps/api/place/autocomplete/json?input=$input&types=address&language=$lang&components=country:za&key=$apiKey

https://maps.googleapis.com/maps/api/geocode/json?latlng=$lat,$lon&key=$apiKey
(其中 $apiKey=我们的 Google Maps API Credentials Key $input、$lang、$lat 和 $lon 代表其他变量)
Google 目前允许对 API 凭据执行以下应用程序限制:

  • HTTP 引用
  • IP 地址
  • 安卓应用
  • iOS 应用程序

  • 当我对我的 key (选项“无”)没有任何限制时,我的移动应用程序工作得非常好。但是,如果我选择将其限制为 iOS 应用程序(并为我的应用程序指定 bundle 标识符),我会收到错误“ 此 IP、站点或移动应用程序无权使用此 API key ”。当我将 key 限制为 Android 应用程序并为 Android 应用程序指定我的包 ID 和 SHA1 签名时,也会发生同样的情况。
    我错过了什么?根据 https://developers.google.com/maps/api-key-best-practices#restrict_apikey我应该可以将 key 限制为我的特定移动应用程序。谷歌地图似乎没有发现我确实是从正确的移动应用程序调用电话。无论我是在模拟器中还是在调试或 Release模式下的实际设备上运行它,都会发生错误。 (我也从 Test Flight 测试了应用程序的 iOS 版本。当我删除限制时,我的 api 调用工作;当我将它限制为我的 iOS 应用程序的 bundle 标识符时它停止工作。)还有什么我需要配置的?问题可能是应用程序是用 Flutter 编写的吗?
    我发现一些链接(如 this )表明移动应用程序不应该直接在 url 中使用 key ,而应该使用我们自己的服务器作为 Google 的代理,然后我们应该限制对我们服务器 IP 的访问。这似乎是不必要的开销,因为将 key 限制为特定应用程序 ID 和平台的选项的存在表明这应该是可能的(正如我引用的 Google 文档一样)。

    最佳答案

    我最终创建了一个代理服务器。 (更多内容见下文)。
    批判性地思考它,我意识到 API 没有任何方法可以辨别传入的请求是否来自特定的移动应用程序,所以我认为对特定 iOS 或 Android 应用程序的限制对于 https 来说是不可能的要求。
    我还调查了一些提供的 flutter 插件,但大多数似乎都使用 google_maps_webservice在后台。并且 google_maps_webservice 需要在应用程序代码中使用 key 或指定代理。大多数从 google_maps_webservice 派生的插件甚至不提供代理选项,并且需要指定 key 。因此,即使使用了这些插件,最终也会“放弃”您在应用程序代码中的 key ,这使得逆向工程和获取您的代码成为可能。 (它最终出现在 iOS 上的 AppDelegate.m 文件和 Android 上的 AndroidManifest.xml 中)。 Google 建议不要以这种方式提供您的 api key 。
    所以我最终创建了一个代理服务器。在没有 key 的情况下向我的代理发出请求,然后代理在添加 key 后将请求传递给 Google。然后代理将响应返回给应用程序。应用程序和应用程序与服务器之间的流量从不包含 key 。
    幸运的是,我的应用程序已经在使用 AWS,并且用户正在使用 Cognito 登录。所以我可以在 API Gateway 中轻松创建代理,并让应用使用 Cognito 对我的代理服务器进行身份验证。这确保只有在 Cognito 中有效登录我的应用程序的用户才能调用代理,并且 key 始终保密。

    关于android - 如何正确限制对 Android 和 iOS 应用程序(用 Flutter 编写)的 Google map (地点、地理编码)API 调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64247109/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com