我正在编写一个连接到 Firebase 实时数据库的 Blazor Server 应用程序。我正在使用 FirebaseDatabase SDK,但需要执行一组更新多个路径的原子操作。由于 SDK 没有相应的方法,我决定使用 REST API。
我已经能够使用电子邮件/通行证进行身份验证,这使我可以访问 currentUser.GetIdTokenAsync();
我能够在单个 Put/Patch 操作中读取/写入数据。
但是,当我尝试使用 REST API 更新路径时,它失败并显示:“未经授权”。
为了测试这一点,我编写了一个简单的代码,如下:
public async Task singleUpdate(string idPropriedade, string idLote, string novoNome)
{
// Firebase database URL
string firebaseUrl = DatabaseProjectSettings.projectURL;
// Define the updates for each path
string jsonContent =
"{" +
"\"lotes\": {" +
"\"" + idPropriedade + "\": {" +
"\"" + idLote + "\": {" +
"\"nomePropriedade\": \"" + novoNome + "\"" +
"}" +
"}" +
"}" +
"}";
var token = await _currUser.GetIdTokenAsync(true);
// Create HttpClient instance
using (HttpClient client = new HttpClient())
{
// Configure the request
HttpRequestMessage request = new HttpRequestMessage
{
Method = HttpMethod.Put,
RequestUri = new Uri($"{firebaseUrl}.json"),
Content = new StringContent(jsonContent, System.Text.Encoding.UTF8, "application/json")
};
request.Headers.Add("Authorization", $"Bearer {token}");
// Send the request and get the response
HttpResponseMessage response = await client.SendAsync(request);
// Check if the request was successful
if (response.IsSuccessStatusCode)
{
Console.WriteLine("Paths updated successfully.");
}
else
{
Console.WriteLine($"Failed to update paths. Status code: {response.StatusCode}");
}
}
}
如果我删除数据库规则,写入操作可以正常工作。如果我离开数据库规则,我会收到“未经授权”消息。
我已经测试过在 URL 上使用令牌,如下所示:
RequestUri = new Uri($"{firebaseUrl}.json?access_token={token}")
,但没有成功!
请将您的见解发送给我!谢谢!
如使用 ID 令牌进行身份验证的文档中所示,您需要在 URL 中的
auth
参数中传递该令牌。
Authorization
标头和access_token
参数仅用于使用OAuth2访问令牌进行身份验证。
如果我删除数据库规则,写入操作可以正常工作。如果我离开数据库规则,我会收到“未经授权”消息。
SDK 在可能具有完全读/写访问权限的服务帐户下运行。使用 API 时,请确保您的
currentUser
与您尝试写入的路径/文档的 Firestore 规则中的 allow update
和/或 allow create
规则匹配。
https://firebase.google.com/docs/firestore/security/get-started