如何让Android应用的所有Firebase请求通过代理转发?
解决Firebase请求通过自定义代理转发的问题
直接修改google-services.json里的firebase_url和storage_bucket无法实现所有Firebase服务的代理转发,原因在于:
- 多数Firebase服务(如Firestore、Auth)的API端点是通过
project_id动态生成的,仅Realtime Database会读取firebase_url,其他服务不会生效 storage_bucket字段要求填写存储桶名称(格式如myproject-asdfa.appspot.com),而非URL,你填写的https://localhost:9000不符合规范,因此不生效
通用解决方案:自定义OkHttpClient拦截所有请求
通过替换Firebase SDK的默认HttpClient,让所有请求走指定代理,适用于所有Firebase服务:
- 创建带代理配置的OkHttpClient
// 配置代理地址和端口 val proxy = Proxy(Proxy.Type.HTTP, InetSocketAddress("localhost", 8000)) val okHttpClient = OkHttpClient.Builder() .proxy(proxy) // 若代理需要认证,取消注释以下代码并填入账号密码 // .proxyAuthenticator { _, response -> // val credential = Credentials.basic("代理用户名", "代理密码") // response.request.newBuilder() // .header("Proxy-Authorization", credential) // .build() // } .build()
- 全局配置Firebase使用自定义HttpClient
在初始化FirebaseApp时传入自定义配置,所有Firebase服务都会复用这个HttpClient:
val firebaseOptions = FirebaseOptions.Builder() .setProjectId("myproject-asdfa") .setApplicationId("你的应用ID(从google-services.json中获取)") .setApiKey("你的API Key(从google-services.json中获取)") .setHttpClient(okHttpClient) .setStorageBucket("myproject-asdfa.appspot.com") // 填写正确的存储桶名称 .build() // 初始化FirebaseApp if (FirebaseApp.getApps(this).isEmpty()) { FirebaseApp.initializeApp(this, firebaseOptions) }
- 针对单个服务单独配置(可选)
如果不需要全局配置,也可以为单个Firebase服务单独设置HttpClient:
- Firestore
val firestore = FirebaseFirestore.getInstance() val settings = firestore.settings.toBuilder() .setHttpClient(okHttpClient) .build() firestore.settings = settings
- Cloud Storage
val storage = FirebaseStorage.getInstance() val storageSettings = FirebaseStorageSettings.Builder() .setHttpClient(okHttpClient) .build() storage.storageSettings = storageSettings
注意事项
- 确保代理服务器能正确转发HTTPS请求,若使用本地代理,需在设备上信任代理的SSL证书,否则会出现SSL握手失败
- Realtime Database可单独通过
firebaseOptions.setDatabaseUrl("https://localhost:8000")配置,但代理需正确转发该地址到实际的Firebase RTDB端点
内容的提问来源于stack exchange,提问作者Shmulinson
相关产品推荐
相关产品推荐

