Dmi*_*lov 3 c# .net-core firebase-authentication
如何从自定义令牌中获取 ID 令牌?
[Fact]
public void Get_ID_Token_For_Service_Account_Test()
{
using (Stream stream = new FileStream(ServiceAccountJsonKeyFilePath, FileMode.Open, FileAccess.Read))
{
ServiceAccountCredential credential = ServiceAccountCredential.FromServiceAccountData(stream);
FirebaseApp.Create(new AppOptions
{
Credential = GoogleCredential.FromServiceAccountCredential(credential),
ServiceAccountId = ServiceAccountId,
});
var uid = "Some UID";
var additionalClaims = new Dictionary<string, object>
{
{"dmitry", "pavlov"}
};
string customToken = FirebaseAuth.DefaultInstance.CreateCustomTokenAsync(uid, additionalClaims).Result;
string idToken= null; // How to get this?
FirebaseToken token = FirebaseAuth.DefaultInstance.VerifyIdTokenAsync(idToken, CancellationToken.None).Result;
Assert.NotNull(token);
Assert.True(token.Claims.ContainsKey("dmitry"));
}
}
Run Code Online (Sandbox Code Playgroud)
我看到了一些其他语言/平台的示例,但没有看到 C# 的示例 - 如何通过当前用户获取 ID 令牌在这里 -检索客户端上的 ID 令牌。但是对于 C# UserRecord 和 FirebaseAuth 都没有提供 ID 令牌。任何指针都非常感谢。
我找到了在FirebaseAdmin集成测试中获取 ID 令牌的方法 - 请参阅方法SignInWithCustomTokenAsync。我唯一需要调整的是基本 URL:根据Firebase Auth REST API文档,它应该是
https://identitytoolkit.googleapis.com/v1/accounts:signInWithCustomToken
该API KEY指Web API Key,可在上获得的项目设置页面中的管理控制台。
所以调整后的代码如下所示:
private static async Task<string> SignInWithCustomTokenAsync(string customToken)
{
string apiKey = "..."; // see above where to get it.
var rb = new Google.Apis.Requests.RequestBuilder
{
Method = Google.Apis.Http.HttpConsts.Post,
BaseUri = new Uri($"https://identitytoolkit.googleapis.com/v1/accounts:signInWithCustomToken")
};
rb.AddParameter(RequestParameterType.Query, "key", apiKey);
var request = rb.CreateRequest();
var jsonSerializer = Google.Apis.Json.NewtonsoftJsonSerializer.Instance;
var payload = jsonSerializer.Serialize(new SignInRequest
{
CustomToken = customToken,
ReturnSecureToken = true,
});
request.Content = new StringContent(payload, Encoding.UTF8, "application/json");
using (var client = new HttpClient())
{
var response = await client.SendAsync(request);
response.EnsureSuccessStatusCode();
var json = await response.Content.ReadAsStringAsync();
var parsed = jsonSerializer.Deserialize<SignInResponse>(json);
return parsed.IdToken;
}
}
Run Code Online (Sandbox Code Playgroud)