如何在C# .NET API中自动获取FCM请求的Bearer Token并刷新
在.NET API中自动获取带FCM权限的OAuth2 Token(自动刷新)
核心依赖
先安装NuGet包:Google.Apis.Auth 或针对ASP.NET Core的 Google.Apis.Auth.AspNetCore3,这两个包会自动处理Token的获取与刷新逻辑。
步骤1:获取Firebase服务账号密钥
- 打开Firebase控制台进入你的项目
- 点击「设置」→「服务账号」
- 点击「生成新的私钥」,下载JSON格式密钥文件并保存到API项目中(注意不要提交到版本库)
步骤2:配置Token获取逻辑
方式1:ASP.NET Core依赖注入配置(推荐)
在Program.cs中添加服务配置:
using Google.Apis.Auth.OAuth2; using System.Net.Http.Headers; var builder = WebApplication.CreateBuilder(args); // 配置Google服务账号凭据 builder.Services.AddSingleton<GoogleCredential>(sp => { // 替换为你的服务账号密钥文件路径 var credentialPath = Path.Combine(AppContext.BaseDirectory, "firebase-service-account.json"); return GoogleCredential.FromFile(credentialPath) .CreateScoped("https://www.googleapis.com/auth/firebase.messaging"); }); // 配置带自动Token注入的HttpClient builder.Services.AddHttpClient("FcmClient", async (sp, client) => { client.BaseAddress = new Uri("https://fcm.googleapis.com/fcm/"); var credential = sp.GetRequiredService<GoogleCredential>(); // 自动获取Token,过期时自动刷新 var token = await credential.UnderlyingCredential.GetAccessTokenForRequestAsync(); client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token); }); var app = builder.Build(); // ... 其他中间件配置
方式2:直接在代码中获取Token(适合非Web项目)
如果是控制台或其他非Web项目,可使用以下代码:
using Google.Apis.Auth.OAuth2; var credentialPath = "path/to/firebase-service-account.json"; var credential = GoogleCredential.FromFile(credentialPath) .CreateScoped("https://www.googleapis.com/auth/firebase.messaging"); // 获取Token(自动处理刷新,无需手动干预) var accessToken = await credential.UnderlyingCredential.GetAccessTokenForRequestAsync();
步骤3:发送FCM消息示例
使用配置好的HttpClient发送请求,无需手动管理Token:
using System.Text; using Newtonsoft.Json; public class FcmService { private readonly HttpClient _fcmClient; public FcmService(IHttpClientFactory httpClientFactory) { _fcmClient = httpClientFactory.CreateClient("FcmClient"); } public async Task SendFcmMessageAsync(string deviceToken, string title, string body) { var payload = new { to = deviceToken, notification = new { title = title, body = body } }; var jsonPayload = JsonConvert.SerializeObject(payload); var content = new StringContent(jsonPayload, Encoding.UTF8, "application/json"); var response = await _fcmClient.PostAsync("send", content); response.EnsureSuccessStatusCode(); } }
关键说明
GoogleCredential会自动缓存Token,过期前自动请求新Token,完全无需手动更新- 生产环境中通过环境变量或配置中心管理密钥文件路径,不要硬编码
- 确保服务账号拥有「Firebase Cloud Messaging Admin」权限,否则会返回权限不足错误
内容的提问来源于stack exchange,提问作者Robert Smith
相关产品推荐
相关产品推荐

