如何在ASP.NET Core中使用Firebase自定义认证令牌查询Firestore?
调整步骤
1. 修正Firestore安全规则的声明路径
Firebase安全规则中,所有自定义声明默认挂载在request.auth.token对象下,而非直接挂载在request.auth上,原规则路径错误会导致鉴权失败。修正后的规则如下:
rules_version = '2'; service cloud.firestore { match /databases/{database}/documents { match /myCollection/{documentId} { allow read: if request.auth.token.documentId == documentId allow write: if request.auth.token.documentId == documentId } } }
2. 验证ID Token的声明有效性
将你请求时携带的token.IdToken复制到JWT解码工具中,确认Payload段存在documentId字段,且字段值和你要请求的文档ID完全一致。如果没有该字段,检查你交换自定义令牌的端点是否为Firebase官方的自定义令牌登录端点,同时检查CreateCustomTokenAsync传入的声明参数是否正确。
3. 修正Firestore请求的变量错误
你在GetPassenger方法中构造请求URL时使用了未定义的变量id,应该替换为方法入参passengerId,否则你请求的文档ID和令牌中携带的documentId不一致,必然触发权限不足。修正后的请求构造代码如下:
[HttpGet] public async Task<IActionResult> GetPassenger(string passengerId) { var token = await _authorizationClient.AuthorizePassenger(passengerId); using HttpClient client = new HttpClient(); HttpRequestMessage message = new HttpRequestMessage(HttpMethod.Get, $"https://firestore.googleapis.com/v1/projects/{_firebaseAuthSettings.ProjectId}/databases/(default)/documents/myCollection/{passengerId}/?key={_firebaseAuthSettings.ApiKey}"); message.Headers.Authorization = new AuthenticationHeaderValue("Bearer", token.IdToken); var response = await client.SendAsync(message); if (!response.IsSuccessStatusCode) { return new StatusCodeResult((int) response.StatusCode); } var docs = await response.Content.ReadAsStringAsync(); return Ok(docs); }
4. 修正中间件初始化的笔误
你在Firebase中间件初始化代码中,ProjectId = setting.ProjectId存在变量名拼写错误,正确应为settings.ProjectId,否则FirebaseApp初始化失败可能导致后续生成的令牌存在隐含问题:
_ = FirebaseApp.Create(new AppOptions { Credential = GoogleCredential.FromJson(settings.ServicePrinciaplJson), ServiceAccountId = settings.ServiceAccountId, ProjectId = settings.ProjectId });
补充说明
Firebase API Playground默认使用你登录的Google Cloud账号凭证鉴权,若该账号拥有项目的编辑/所有者权限,会优先走IAM权限逻辑绕过安全规则,属于预期行为,不代表你的规则配置异常。
内容的提问来源于stack exchange,提问作者Phil DeVeau
相关产品推荐
相关产品推荐

