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

时间:2018-03-08 13:28:48

标签: java firebase firebase-authentication firebase-admin

我尝试使用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();

我做错了什么?

2 个答案:

答案 0 :(得分:2)

我相信这是一个错误。如您所见{279},令牌验证程序不使用通过选项注入的HTTP传输。如果你能在GitHub上为此创建一个问题,我将不胜感激。

与此同时,您可以通过为JVM配置HTTP / S代理来解决此限制。尝试在启动JVM时设置https.proxyHosthttps.proxyPort系统属性(更多详细信息here)。

答案 1 :(得分:1)

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

与此同时,我已经反编译了WebSocket类(com.google.firebase.database.tubesock.WebSocket),并自己创建了一个底层套接字,然后在我的项目的新包中将这个反编译的类droped: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);