使用代理设置 Firebase admin sdk (Java)
Set up Firebase admin sdk with proxy (Java)
我正在尝试使用 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();
我做错了什么?
我认为这是一个错误。如您所见 here,令牌验证器不使用通过选项注入的 HTTP 传输。如果您能在 GitHub.
上为此创建一个问题,我将不胜感激
同时,您可以通过为 JVM 配置 HTTP/S 代理来绕过此限制。尝试在启动 JVM 时设置 https.proxyHost
和 https.proxyPort
系统属性(更多详细信息 here)。
我遇到了同样的问题,还在等待更好的解决方案。
同时,我反编译了WebSocket class (com.google.firebase.database.tubesock.WebSocket),并自己创建了一个底层套接字,然后将这个反编译的class放到了一个新的包中我的项目:com.google.firebase.database.tubesock.
SSLSocket 的创建围绕 class 的第 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);
我正在尝试使用 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();
我做错了什么?
我认为这是一个错误。如您所见 here,令牌验证器不使用通过选项注入的 HTTP 传输。如果您能在 GitHub.
上为此创建一个问题,我将不胜感激同时,您可以通过为 JVM 配置 HTTP/S 代理来绕过此限制。尝试在启动 JVM 时设置 https.proxyHost
和 https.proxyPort
系统属性(更多详细信息 here)。
我遇到了同样的问题,还在等待更好的解决方案。
同时,我反编译了WebSocket class (com.google.firebase.database.tubesock.WebSocket),并自己创建了一个底层套接字,然后将这个反编译的class放到了一个新的包中我的项目:com.google.firebase.database.tubesock.
SSLSocket 的创建围绕 class 的第 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);