当 Firebase 的 HTTP 调用与凭据刷新必须使用同一个代理时,要同时配置这两个传输入口。从HTTP 代理列表选出的公共 HTTP 端点同样需要这一对交接:

var proxy = new java.net.Proxy(
    java.net.Proxy.Type.HTTP,
    new java.net.InetSocketAddress("proxy.example.net", 8080));

var transport =
    new com.google.api.client.http.javanet.NetHttpTransport.Builder()
        .setProxy(proxy)
        .build();

var credentials = com.google.auth.oauth2.GoogleCredentials.fromStream(
    serviceAccountStream, () -> transport);

var options = com.google.firebase.FirebaseOptions.builder()
    .setCredentials(credentials)
    .setHttpTransport(transport)
    .build();

var app = com.google.firebase.FirebaseApp.initializeApp(options);

两个关键交接分别是fromStream(serviceAccountStream, () -> transport)与setHttpTransport(transport)。前者为获取访问令牌提供 HTTP 传输,后者提供 Firebase 应用的 HTTP 传输。只设置其中一个,另一个可能仍走默认路由。

serviceAccountStream是应用可信服务账号的凭据流。把它留给应用的工作负载,并按 Firebase 正常的生命周期释放。代理设置会保留目标主机名以完成 TLS 校验;既不需要替换 SDK 类,也不需要信任一切的 SSL 工厂。

这里的范围是文中展示的 HTTP 接口。使用 Realtime Database WebSocket 或其他服务传输的工作负载,需要单独核对该传输的路由支持。

相关文章