如何限制Cordova打包的Firebase应用API密钥访问权限?
针对Cordova+Firebase应用的API密钥权限限制方案
核心结论
虽然你的应用基于Web技术开发,但因为是Cordova打包成安卓原生容器,必须在谷歌云控制台选择「安卓应用」作为API密钥的访问限制类型——所有从应用发出的Firebase请求,最终会通过安卓容器携带应用的签名和包名信息,谷歌会验证这些信息是否匹配你配置的规则。
具体操作步骤
获取安卓应用的SHA-1指纹
- 发布版:使用你签名APK的keystore文件,执行命令:
keytool -list -v -keystore /path/to/your/release.keystore -alias your-keystore-alias - 调试版:使用默认调试keystore(路径一般为
~/.android/debug.keystore),执行命令:keytool -list -v -keystore ~/.android/debug.keystore -alias androiddebugkey -storepass android -keypass android
记录输出中的
SHA1指纹字符串。- 发布版:使用你签名APK的keystore文件,执行命令:
配置谷歌云控制台的API密钥限制
- 进入谷歌云控制台,找到对应Firebase项目的API密钥(可在Firebase控制台「项目设置」→「通用」→「Web应用」的配置中找到对应的API密钥)
- 编辑该API密钥的访问限制:
- 选择「安卓应用」选项
- 点击「添加安卓应用」,输入你的应用包名(即Cordova config.xml中
<widget>标签的id属性值,比如com.yourcompany.yourapp),以及刚才获取的SHA-1指纹 - 调试版和发布版的SHA-1都要添加,避免调试时API请求被拦截
配合Firebase安全规则强化防护
API密钥限制只是第一道防线,必须结合Firebase的安全规则防止合法用户滥用:- 强制用户认证:比如数据库规则要求
request.auth != null才能读写 - 细化权限:比如限制用户只能操作自己的数据,示例规则:
rules_version = '2'; service cloud.firestore { match /databases/{database}/documents { match /users/{userId} { allow read, write: if request.auth != null && request.auth.uid == userId; } } }
- 强制用户认证:比如数据库规则要求
启用Firebase App Check(可选但推荐)
App Check会进一步验证请求是否来自你的合法应用,针对Cordova安卓应用,可配置SafetyNet作为验证提供商:- 在Firebase控制台启用App Check,选择你的安卓应用
- 按照指引配置SafetyNet,确保你的应用包名和SHA-1已在谷歌云控制台关联
- 在Cordova代码中初始化App Check,验证请求合法性
关键注意事项
- 即使APK被解压,他人获取到Firebase配置中的API密钥,也无法在其他环境(比如自己的Web应用、其他安卓应用)调用你的Firebase服务,因为请求缺少你的应用签名和包名,会被谷歌拦截
- 不要仅依赖API密钥限制,必须结合用户认证和安全规则,形成多层防护
内容的提问来源于stack exchange,提问作者EMR
相关产品推荐
相关产品推荐

