You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 19:17:01