Windows下.NET8 C#生成Firebase推送V1 API OAuth2令牌遇认证错误
FCM V1 API 401 未授权问题排查与解决方案
核心错误原因
你手动获取令牌的方式存在不规范之处,虽然能拿到有效期1小时的JWT,但该令牌的权限范围或认证上下文未被FCM V1服务正确识别。另外你的推送Payload也存在参数位置错误(虽不直接导致401,但会影响推送效果)。
修复手动调用的令牌获取逻辑
你不需要直接访问UnderlyingCredential,GoogleCredential本身已封装了正确的AccessToken获取方法,且必须先通过CreateScoped绑定FCM专属权限范围。修正后的GetJwtToken方法如下:
public static async Task<string> GetJwtToken() { try { // 直接从文件读取并绑定FCM权限范围 var credentials = GoogleCredential.FromFile("credentials.json") .CreateScoped("https://www.googleapis.com/auth/firebase.messaging"); // 使用Credential自身的方法获取AccessToken return await credentials.GetAccessTokenForRequestAsync(); } catch (Exception ex) { Console.WriteLine($"Exception: {ex.Message}"); return ""; } }
额外的Payload参数修正
你将content_available放在了notification字段下,这是错误的,该参数属于message级别的配置,用于触发iOS静默推送,正确的Payload结构应该是:
var payload = new { message = new { token = kMyToken, notification = new { title = "Test Title", subtitle = "Test Sub-title", body = "Test body." }, data = new { key_1 = "posJob", key_2 = "Value for key_2" }, content_available = true // 移到message层级 } };
官方推荐的简化方案:使用Firebase Admin SDK for .NET
手动调用API需要处理令牌、请求构造、错误处理等细节,官方提供的Admin SDK会自动完成这些工作,更稳定且不易出错。
步骤1:安装NuGet包
Install-Package FirebaseAdmin
步骤2:使用SDK发送推送
using FirebaseAdmin; using FirebaseAdmin.Messaging; using Google.Apis.Auth.OAuth2; class Program { static async Task Main(string[] args) { // 初始化SDK(全局只需要初始化一次) if (FirebaseApp.DefaultInstance == null) { FirebaseApp.Create(new AppOptions() { Credential = GoogleCredential.FromFile("credentials.json"), }); } await SendNotificationAsync(); } public static async Task SendNotificationAsync() { const string kMyToken = "myToken"; var message = new Message() { Token = kMyToken, Notification = new Notification() { Title = "Test Title", Body = "Test body.", Subtitle = "Test Sub-title" // iOS专属字段,SDK已封装 }, Data = new Dictionary<string, string>() { { "key_1", "posJob" }, { "key_2", "Value for key_2" } }, ContentAvailable = true // 正确配置静默推送开关 }; try { string response = await FirebaseMessaging.DefaultInstance.SendAsync(message); Console.WriteLine($"推送成功:{response}"); } catch (FirebaseMessagingException ex) { Console.WriteLine($"推送失败:{ex.Message}"); } } }
最后验证点
- 确保服务账号已在Google Cloud IAM中分配
Firebase Cloud Messaging Admin角色 - 确认
credentials.json的项目ID与请求URL中的myProject完全一致 - 检查设备令牌
kMyToken是否有效且未过期
内容的提问来源于stack exchange,提问作者Exquirentibus
相关产品推荐
相关产品推荐

