目前我正在使用静态服务器密钥发送消息
conn.setRequestProperty("Authorization", SERVERKEY);
现在我将通过 OAuth 2.0 发送带有访问令牌的消息。
conn.setRequestProperty("Authorization", "Bearer ACCESSTOKEN");
访问令牌的有效期为 1 小时。 我需要检索新的有效访问令牌。 我正在尝试使用 Firebase 文档来实现这一点。 在 Firebase 控制台中生成了一个 json 文件。
private static final String MESSAGING_SCOPE = "https://www.googleapis.com/auth/firebase.messaging";
private static final String[] SCOPES = { MESSAGING_SCOPE };
private static String getAccessToken() throws IOException {
GoogleCredentials googleCredentials = GoogleCredentials
.fromStream(new FileInputStream("service.json"))
.createScoped(Arrays.asList(SCOPES));
googleCredentials.refreshIfExpired();
AccessToken token = googleCredentials.getAccessToken();
return token.getTokenValue();
}
但是较长时间后的输出是:
Exception in thread "main" java.lang.NoSuchMethodError: com.google.common.util.concurrent.Futures.getDone(Ljava/util/concurrent/Future;)Ljava/lang/Object;
at com.google.auth.oauth2.OAuth2Credentials.finishRefreshAsync(OAuth2Credentials.java:287)
at com.google.auth.oauth2.OAuth2Credentials.access$300(OAuth2Credentials.java:67)
....
我已将 firebase-admin 库嵌入为 Maven 项目:
<dependency>
<groupId>com.google.firebase</groupId>
<artifactId>firebase-admin</artifactId>
<version>9.2.0</version>
</dependency>
问题解决了!
上述错误是在Eclipse IDE中。
在 IntelliJ 下,错误输出是另一个:
Error getting access token for service account: Connect timed out
IntelliJ IDE 中的代理设置没有变化,但源代码中:
System.setProperty("https.proxyHost", "PROXYSERVER");
System.setProperty("https.proxyPort", "PROXYPORT");
System.setProperty("com.google.api.client.should_use_proxy","true");
我收到访问令牌。
错误出现在 Eclipse IDE 中。
在 IntelliJ 下,错误输出是另一个:
Error getting access token for service account: Connect timed out
IntelliJ IDE 中的代理设置没有变化,但源代码中:
System.setProperty("https.proxyHost", "PROXYSERVER");
System.setProperty("https.proxyPort", "PROXYPORT");
System.setProperty("com.google.api.client.should_use_proxy","true");
我收到访问令牌。
此答案作为 edit 发布到问题 Send Firebase FCM HTTP v1 API with Java (SOLVED) 由 OP user2166934 在 CC BY-SA 4.0 下发布。