C# 中的 Google Identity Toolkit API

一些背景信息

我正在使用 C# 在 Unity 中构建游戏。由于我使用的是 Firebase,并且现成的 Unity Firebase SDK 在我的情况1中无法工作,因此我通过 C#类(附带)与Firebase 的 REST API进行交互。HttpClientSystem.Net.Http

我目前正在努力使用 Firebase 身份验证 API。对于那些不熟悉 OAuth API 的人,当我调用注册或登录端点时,我会同时获得ID TokenRefresh Token。ID 令牌过期;刷新令牌则不然。当 ID 令牌过期时,我必须调用另一个端点(称为Token Exchange ),以使用刷新令牌获取新的 ID 令牌。

1据传有一个Google Identity Toolkit C# 库,但我发现它的搜索返回的第一个结果导致 404 错误而不是文档。😢

什么有效

按照Firebase 指南和底层Identity Toolkit 指南,到目前为止,我已经成功地将令牌交换端点与cURLbash 中的命令连接起来:

curl 'https://securetoken.googleapis.com/v1/token?key=[MY FIREBASE API KEY]' \
-H 'Content-Type: application/x-www-form-urlencoded' \
--data 'grant_type=refresh_token&refresh_token=[MY REFRESH TOKEN]'

当然,我替换[MY FIREBASE API KEY]为我的 Firebase Web API 密钥以及[MY REFRESH TOKEN]从登录/注册端点返回的刷新令牌。

然而,尽管我进行了多次尝试,我仍然无法cURL在 C# 中复制这个命令!

我失败的尝试

1.

这是我原来的代码,不起作用。


public async Task<bool> ExchangeToken()

    {

        FormUrlEncodedContent body = new FormUrlEncodedContent(new Dictionary<string, string>() {

            {"grant_type", "refresh_token" },

            {"refresh_token", Uri.EscapeDataString(user.refreshToken) }

        });

        HttpRequestMessage message = new HttpRequestMessage(HttpMethod.Post, "https://securetoken.googleapis.com/v1/token?key=" + apiKey);

        message.Content = body;

        message.Headers.Accept.Add(new MediaTypeWithQualityHeaderValue("application/x-www-form-urlencoded"));

        HttpResponseMessage res = await client.SendAsync(message);

    }


这很奇怪,考虑到我2XX (OK)从应该是等效cURL命令的响应中得到了响应......

可能的线索

  1. 我对所有其他端点的所有其他请求都有效。有两个显着的区别:1)从技术上讲,API 不是 Firebase 的,而是 Google Identity Toolkit 的。2)这是我正在使用的唯一使用Content-Type标头application/x-www-form-urlencoded而不是 的端点application/json

我的问题 / TL;DR

如何使用 C#与Google Identity Toolkit API 的令牌交换端点进行交互?(虽然我目前正在使用 HttpClient 类,但我对其他解决方案完全持开放态度!它们只需与 Unity3D 兼容即可。)

提前致谢!



慕工程0101907
浏览 144回答 3
3回答

慕的地6264312

Google 希望您使用 Firebase 进行身份验证。虽然 Firebase 没有 Google 提供的 .NET 客户端 SDK,但还有其他选择。如果您不使用 Firebase 并自行使用 oAuth/OpenID Connect 端点执行必要的任务,那也可以。有一个Google .NET SDK可以帮助您解决这个问题......一点点。SDK列出了该SDK“支持”的Google API;Google Cloud Identityv1和v1betaAPI 均在列表中。因此,您可以通过此 .NET SDK 调用 Google Cloud Identity 端点。您确实必须了解各种身份验证流程的含义,而在 Firebase 中,作为应用程序开发人员,大部分机制都是从您那里抽象出来的。

暮色呼如

在进一步研究代码后,我记得我正在对我的HttpClient:client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", idToken);所有其他 API 调用都包含此内容,因为它们需要使用 ID 令牌进行身份验证。然而,这似乎混淆了代币交换端点;它必须1)查找授权标头,然后 2)使用消息内容中提供的刷新令牌。如何解决此问题不要在您的服务器上设置默认标头HttpClient(该标头应该被重复用于所有HTTP 请求),而是执行以下操作:var req = new HttpRequestMessage(/* HttpMethod enum value, endpoint URL/IP */);req.Headers.Authorization = new AuthenticationHeaderValue("Bearer", user.idToken); //Set the authorization per-request, not globallyvar res = await client.SendAsync(req);然后只需调用令牌交换端点即可!来自Firebase REST API 文档:您可以通过向 securetoken.googleapis.com 端点发出 HTTP POST 请求来刷新 Firebase ID 令牌。https://securetoken.googleapis.com/v1/token?key=[API_KEY]refresh_token只需在正文中提供一个参数(以及强制的grant_typevalue refresh_token)。不要提供授权标头。希望这可以帮助任何遇到同样问题的人!

翻翻过去那场雪

作为替代方案,您还可以使用https://github.com/google/apis-client-generator从发现文档生成 c# 客户端。当我生成我的文件时,我遇到了一些命名冲突,但在解决这些冲突后,它就可以工作了。
打开App,查看更多内容
随时随地看视频慕课网APP