调用Firebase AppCheck Google API验证Token时如何完成身份认证
解决Firebase AppCheck验证API的401未认证问题
调用https://firebaseappcheck.googleapis.com/v1beta/projects/{projectId}:verifyAppCheckToken端点需要服务端身份认证,你创建的OAuth 2.0 Client ID并不适用于这种场景——它是给用户端授权用的,服务端调用这类管理API应该用服务账号密钥来获取访问令牌。
下面是具体解决步骤:
1. 获取服务账号密钥
- 打开Google Cloud Console,进入你的目标项目
- 导航到「IAM与管理」→「服务账号」
- 创建新服务账号(或选择已有账号),给它分配Firebase App Check Admin角色(该角色拥有验证AppCheck令牌的权限)
- 点击目标服务账号→「密钥」→「添加密钥」→「创建新密钥」,选择JSON格式,下载密钥文件到本地
2. 在.NET中获取访问令牌
先安装必要的NuGet包:
Install-Package Google.Apis.Auth
用代码生成访问令牌:
using Google.Apis.Auth.OAuth2; using System.Threading.Tasks; public async Task<string> GetAccessTokenAsync(string serviceAccountKeyPath) { var credential = GoogleCredential.FromFile(serviceAccountKeyPath) .CreateScoped("https://www.googleapis.com/auth/firebase.appcheck"); var token = await credential.UnderlyingCredential.GetAccessTokenForRequestAsync(); return token; }
3. 携带令牌调用验证API
不管用HttpClient还是官方SDK,都要在请求头中添加Authorization: Bearer {token}。
用HttpClient的示例:
using System.Net.Http; using System.Net.Http.Headers; using System.Text; using Newtonsoft.Json; using System.Threading.Tasks; public async Task<HttpResponseMessage> VerifyAppCheckTokenAsync(string projectId, string appCheckToken, string serviceAccountKeyPath) { var accessToken = await GetAccessTokenAsync(serviceAccountKeyPath); var client = new HttpClient(); client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", accessToken); var requestBody = new { appCheckToken = appCheckToken }; var content = new StringContent(JsonConvert.SerializeObject(requestBody), Encoding.UTF8, "application/json"); var url = $"https://firebaseappcheck.googleapis.com/v1beta/projects/{projectId}:verifyAppCheckToken"; return await client.PostAsync(url, content); }
用官方Firebase AppCheck SDK的示例(更简洁):
先安装SDK包:
Install-Package Google.Apis.FirebaseAppCheck.v1beta
调用代码:
using Google.Apis.FirebaseAppCheck.v1beta; using Google.Apis.FirebaseAppCheck.v1beta.Data; using Google.Apis.Services; using System.Threading.Tasks; public async Task<GoogleFirebaseAppcheckV1betaVerifyAppCheckTokenResponse> VerifyTokenWithSdkAsync(string projectId, string appCheckToken, string serviceAccountKeyPath) { var credential = GoogleCredential.FromFile(serviceAccountKeyPath) .CreateScoped(FirebaseAppCheckService.Scope.FirebaseAppcheck); var service = new FirebaseAppCheckService(new BaseClientService.Initializer { HttpClientInitializer = credential }); var request = new GoogleFirebaseAppcheckV1betaVerifyAppCheckTokenRequest { AppCheckToken = appCheckToken }; return await service.Projects.VerifyAppCheckToken(request, $"projects/{projectId}").ExecuteAsync(); }
注意事项
- 确保服务账号的角色权限配置正确,权限不足会返回403错误
- 密钥文件需妥善保管,禁止提交到代码仓库
- 访问令牌默认1小时过期,可缓存令牌减少重复请求
内容的提问来源于stack exchange,提问作者Esteban Chornet
相关产品推荐
相关产品推荐

