亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

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 關注
  • 193 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號