Spring Boot集成FCM推送报错:刷新访问令牌时出现未知错误
解决Spring Boot集成FCM时"Unexpected error refreshing access token"错误
针对你遇到的FCM访问令牌刷新错误,以下是几个可行的排查和解决方向:
1. 重新验证服务账号密钥文件
- 从Firebase控制台重新下载
firebase-service-account.json,避免使用复制粘贴或已过期的文件。 - 检查文件内的
private_key字段是否完整,确保没有丢失换行符或格式错乱(该字段通常以-----BEGIN PRIVATE KEY-----开头,-----END PRIVATE KEY-----结尾)。
2. 升级Firebase Admin SDK版本
你当前使用的9.1.1版本较旧,存在已知的令牌刷新相关bug。建议升级到最新稳定版:
<dependency> <groupId>com.google.firebase</groupId> <artifactId>firebase-admin</artifactId> <version>22.0.0</version> <!-- 替换为Maven仓库中的最新稳定版本 --> </dependency>
3. 优化FirebaseApp初始化逻辑
避免重复初始化FirebaseApp导致的资源冲突,修改Bean初始化代码:
@Bean FirebaseMessaging firebaseMessaging() throws IOException { GoogleCredentials googleCredentials = GoogleCredentials .fromStream(new ClassPathResource("firebase-service-account.json").getInputStream()); FirebaseOptions firebaseOptions = FirebaseOptions .builder() .setCredentials(googleCredentials) .build(); // 检查是否已存在同名App,避免重复初始化 FirebaseApp app = FirebaseApp.getApps().stream() .filter(a -> "<project-name-here>".equals(a.getName())) .findFirst() .orElseGet(() -> FirebaseApp.initializeApp(firebaseOptions, "<project-name-here>")); return FirebaseMessaging.getInstance(app); }
4. 检查网络连通性
- 确保服务器能正常访问Google OAuth2令牌服务(
https://oauth2.googleapis.com/token),若在国内环境需配置合规的网络代理。 - 排查Spring Boot项目是否有自定义的网络拦截器、RestTemplate配置,避免干扰FCM SDK的网络请求。
5. 确认服务账号权限
再次验证服务账号的角色权限:
- 登录Google Cloud控制台,进入对应项目 → IAM与管理员 → IAM
- 找到
firebase-service-account.json中client_email对应的账号,确认其拥有Firebase Cloud Messaging Admin或Editor角色。
6. 调整消息发送的异步调用方式
sendAsync(message).get()会阻塞线程且无超时控制,可能引发超时异常,建议添加超时限制:
public String send(Note note) throws FirebaseMessagingException, ExecutionException, InterruptedException, TimeoutException { // 省略通知构建代码... return firebaseMessaging.sendAsync(message).get(5, TimeUnit.SECONDS); }
内容的提问来源于stack exchange,提问作者Meeran Malik
相关产品推荐
相关产品推荐

