使用代理设置 Firebase 管理 sdk (Java)

问题描述 投票:0回答:3

我正在尝试使用 firebase 通过 Google 对我的用户进行身份验证。在我的 Java 服务器上,我正在验证 idToken 的有效性,每次收到此错误时:

com.google.firebase.auth.FirebaseAuthException: Error while verifying token signature.

我发现问题出在我的服务器代理避免了 sdk 发出的 http 请求。我在我的计算机上测试了我的代码并且它有效,所以我很确定问题出在代理上。

这是我的代码:

InputStream serviceAccount = getClass().getClassLoader().getResourceAsStream(<fileName>);

Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress(<address>, <port>));
HttpTransport httpTransport = new NetHttpTransport.Builder().setProxy(proxy).build();

HttpTransportFactory httpTransportFactory = () -> httpTransport;

FirebaseOptions options = new FirebaseOptions.Builder()
   .setCredentials(GoogleCredentials.fromStream(serviceAccount, httpTransportFactory))
   .setDatabaseUrl(<adress>)
   .setHttpTransport(httpTransport)
   .build();
FirebaseApp.initializeApp(options);
FirebaseToken decodedToken = FirebaseAuth.getInstance().verifyIdTokenAsync(<token>).get();

我做错了什么?

java firebase firebase-authentication firebase-admin
3个回答
2
投票

我相信这是一个错误。正如您在here所看到的,令牌验证器不使用通过选项注入的HTTP传输。如果您能在 GitHub 上为此创建一个问题,我将不胜感激。

同时,您也许可以通过为 JVM 配置 HTTP/S 代理来绕过此限制。尝试在启动 JVM 时设置

https.proxyHost
https.proxyPort
系统属性(更多详细信息此处)。


1
投票

我也遇到了同样的问题,仍在等待更好的解决方案。

与此同时,我反编译了WebSocket类(com.google.firebase.database.tubesock.WebSocket),并自己创建了一个底层套接字,然后将这个反编译的类放入我的项目中的一个新包中:com.google .firebase.database.tubesock.

SSLSocket 的创建是在该类的第 295 行左右。

我用这种方式创建了套接字:

SSLSocketFactory factory = (SSLSocketFactory)SSLSocketFactory.getDefault();

InetSocketAddress proxyAddr = new InetSocketAddress("200.5.92.169", 8080);
Socket underlying = new Socket(new Proxy(Proxy.Type.HTTP, proxyAddr));
underlying.connect(new InetSocketAddress(host, port));
SSLSocket sslSocket  = (SSLSocket) factory.createSocket(underlying, host, port, true);

0
投票

我发现你的错误了。您缺少 FirebaseOptions.Builder 的一种方法,即:

.setHttpTransport(传输)

代码应该是这样的:

         NetHttpTransport transport = new NetHttpTransport.Builder()
             .setProxy(new Proxy(Proxy.Type.HTTP, new InetSocketAddress(proxyProps.getHost(), proxyProps.getPort())))
             .build();

         FirebaseOptions options = FirebaseOptions.builder()
             .setCredentials(GoogleCredentials.fromStream(inputStream, () -> transport))
             .setHttpTransport(transport)
             .build();
         
         FirebaseApp.initializeApp(options);
© www.soinside.com 2019 - 2024. All rights reserved.