为了账号安全,请及时绑定邮箱和手机立即绑定

C# 中的 Google Identity Toolkit API

C# 中的 Google Identity Toolkit API

C#
慕工程0101907 2023-08-20 15:52:08
一些背景信息我正在使用 C# 在 Unity 中构建游戏。由于我使用的是 Firebase,并且现成的 Unity Firebase SDK 在我的情况1中无法工作,因此我通过 C#类(附带)与Firebase 的 REST API进行交互。HttpClientSystem.Net.Http我目前正在努力使用 Firebase 身份验证 API。对于那些不熟悉 OAuth API 的人,当我调用注册或登录端点时,我会同时获得ID Token和Refresh 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)从技术上讲,API 不是 Firebase 的,而是 Google Identity Toolkit 的。2)这是我正在使用的唯一使用Content-Type标头application/x-www-form-urlencoded而不是 的端点application/json。我的问题 / TL;DR如何使用 C#与Google Identity Toolkit API 的令牌交换端点进行交互?(虽然我目前正在使用 HttpClient 类,但我对其他解决方案完全持开放态度!它们只需与 Unity3D 兼容即可。)提前致谢!
查看完整描述

3 回答

?
慕的地6264312

TA贡献1817条经验 获得超6个赞

Google 希望您使用 Firebase 进行身份验证。虽然 Firebase 没有 Google 提供的 .NET 客户端 SDK,但还有其他选择。

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


查看完整回答
反对 回复 2023-08-20
?
暮色呼如

TA贡献1853条经验 获得超9个赞

在进一步研究代码后,我记得我正在对我的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 globally

var 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)。不要提供授权标头。


希望这可以帮助任何遇到同样问题的人!


查看完整回答
反对 回复 2023-08-20
?
翻翻过去那场雪

TA贡献2065条经验 获得超14个赞

作为替代方案,您还可以使用https://github.com/google/apis-client-generator从发现文档生成 c# 客户端。当我生成我的文件时,我遇到了一些命名冲突,但在解决这些冲突后,它就可以工作了。



查看完整回答
反对 回复 2023-08-20
  • 3 回答
  • 0 关注
  • 143 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信