【问题标题】:Set up Firebase admin sdk with proxy (Java)使用代理 (Java) 设置 Firebase admin sdk
【发布时间】:2018-08-16 21:00:05
【问题描述】:

我正在尝试使用 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


    【解决方案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);
    

    【讨论】:

    • 似乎是解决方法!您能否对这种方法进行一些说明:您是否从github.com/firebase/firebase-android-sdk/tree/master/…(tubesock repo)手动导入了所有需要的类,或者找到了一些更聪明的解决方法?我问这个是因为自定义 WebSocket 类需要来自 firebase Tubesock 包的大量依赖项。
    • 只需反编译 WebSocket 类,在您的项目中创建一个名为“com.google.firebase.database.tubesock”的包,然后将新反编译的 WebSocket 类放在那里。接下来,您必须修改我提到的代码块。注意 firebase-admin 版本。我已经使用 5.2.0 版本,我尝试升级到更新的版本,但这种方法停止工作,因为相关的类发生了很大变化。
    • 非常感谢,已经在服务器端以另一种方式解决了这个问题。是的,在 5.2.0 之前唯一可用的版本可能很少。
    • @kkaun:如果可以的话,请您检查一下这篇文章并帮助我吗?我对 FCM 有类似的问题。 stackoverflow.com/questions/53272413/…
    • @zappee,我认为在我检查您的评论之前,该帖子已被其作者删除。
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-12-16
      • 2020-12-14
      • 2017-09-27
      • 1970-01-01
      • 2018-03-20
      • 2020-01-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多