如何通过 FirebaseAdmin SDK 从自定义令牌获取 ID 令牌?

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 令牌。任何指针都非常感谢。

Dmi*_*lov 5

我找到了在FirebaseAdmin集成测试中获取 ID 令牌的方法 - 请参阅方法SignInWithCustomTokenAsync。我唯一需要调整的是基本 URL:根据Firebase Auth REST API文档,它应该是

https://identitytoolkit.googleapis.com/v1/accounts:signInWithCustomToken

API KEYWeb 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)