使用AccessToken调用Firestore获取集合时遇Grpc连接错误求助
问题背景
使用AccessToken连接Firestore时抛出Grpc.Core.RpcException: Status(StatusCode="Unavailable", Detail="failed to connect to all addresses"),但Postman可正常通过REST接口获取数据,且不使用Firebase Admin SDK。
核心原因
默认的Firestore .NET客户端使用Grpc协议通信,部分环境(如代理、防火墙)会拦截Grpc流量;而Postman使用的是Firestore REST API,不受此限制。此外,Token权限配置或客户端网络设置也可能导致该问题。
解决方案
1. 强制切换为REST API通信
修改Firestore客户端配置,强制使用REST接口替代Grpc,和Postman的通信方式保持一致:
private static FirestoreDb GetFirestoreDb() { var builder = new FirestoreDbBuilder(); builder.ProjectId = "Your-Project-Id"; // 从Firebase Auth接口获取的有效AccessToken string oauthToken = "Your-Access-Token"; ITokenAccess credential = GoogleCredential.FromAccessToken(oauthToken); builder.TokenAccessMethod = credential.GetAccessTokenForRequestAsync; // 关键配置:启用REST API builder.UseRestApi = true; // 若需代理,添加以下配置(根据实际环境调整) // builder.HttpClient = new HttpClient(new HttpClientHandler // { // Proxy = new WebProxy("http://your-proxy-address:port", true), // UseProxy = true // }); return builder.Build(); }
2. 验证AccessToken的有效性与权限
- 确认Token是通过Firebase Auth的
signInWithCustomToken接口正确获取,且未过期 - 检查Token包含的权限范围:需包含
https://www.googleapis.com/auth/datastore或https://www.googleapis.com/auth/firestore - 确认Firebase安全规则允许该Token对应的用户访问目标集合(如
windows_test),示例规则:rules_version = '2'; service cloud.firestore { match /databases/{database}/documents { match /windows_test/{document} { allow read, write: if request.auth != null; } } }
3. 调整Grpc网络配置(若坚持使用Grpc)
如果必须使用Grpc,可配置客户端适配代理或调整连接策略:
private static FirestoreDb GetFirestoreDb() { var builder = new FirestoreDbBuilder(); builder.ProjectId = "Your-Project-Id"; string oauthToken = "Your-Access-Token"; ITokenAccess credential = GoogleCredential.FromAccessToken(oauthToken); builder.TokenAccessMethod = credential.GetAccessTokenForRequestAsync; // 配置Grpc通道的代理与重试策略 builder.GrpcChannelOptions = new GrpcChannelOptions { HttpHandler = new HttpClientHandler { Proxy = new WebProxy("http://your-proxy-address:port", true), UseProxy = true }, MaxRetryAttempts = 3, RetryPolicy = Grpc.Core.RetryPolicy.Default }; return builder.Build(); }
验证
修改配置后重新运行代码,若切换到REST API,应能和Postman一样正常获取集合数据。
内容的提问来源于stack exchange,提问作者Osama Nasir
相关产品推荐
相关产品推荐

