受限Google API密钥仅移除包限制后部分服务可用的问题求助
Flutter Google API密钥包SHA1限制导致部分服务失效的解决方案
现状梳理
已启用的Google API服务:
- Directions API
- Geocoding API
- Geolocation API
- Identity API
- Toolkit API
- Maps SDK for Android
- Maps Static API
- Places API
各功能可用性:
google_maps_flutter地图功能:始终可用flutter_google_places地点自动补全:仅移除包SHA1限制后可用geolocator用户定位:始终可用google_place地点评论:仅移除包SHA1限制后可用flutter_polyline_points两点路径规划:仅移除包SHA1限制后可用
问题根源
核心原因是不同Flutter插件调用Google API的方式存在差异,包SHA1限制仅对Android SDK原生调用生效,而部分插件依赖的是Web服务类API,这类API不识别Android包SHA1限制:
google_maps_flutter直接调用Maps SDK for Android,完全匹配包SHA1限制规则,所以不受影响geolocator依赖设备系统定位或Geolocation API的设备端调用,也符合包限制要求- 失效的三个插件,调用的是Places Web Service、Directions Web Service这类纯HTTP接口,这类接口的访问限制逻辑和Android包无关,包SHA1限制会直接拦截它们的请求
解决步骤
- 拆分API密钥
在Google Cloud控制台创建两个独立的API密钥:- 密钥1(Android专属):配置包名+SHA1指纹限制,关联Maps SDK for Android、Geolocation API等Android原生服务
- 密钥2(Web服务专属):配置IP地址限制(测试阶段用本地公网IP,生产环境如果是后端代理则用服务器IP),关联Directions API、Places API(Web服务)、Geocoding API等Web服务类API
- 分插件配置密钥
在Flutter项目中给不同插件指定对应密钥:google_maps_flutter使用密钥1flutter_google_places、google_place、flutter_polyline_points使用密钥2
- 验证权限关联
检查每个密钥的API关联列表,确保没有漏开对应服务的权限,避免因权限缺失导致的请求失败
额外提醒
- Web服务类API不要配置Android包SHA1限制,这类限制对纯HTTP请求无效
- 生产环境建议通过后端代理Web服务API请求,既可以避免客户端暴露密钥,也能更安全地管控IP访问范围
内容的提问来源于stack exchange,提问作者Matteo Antolini
相关产品推荐
相关产品推荐

