簡體   English   中英

如何驗證與外部提供商 (Google) 的 HttpClient 連接

[英]How to authenticate an HttpClient connection with an external provider (Google)

編輯:

這是我重新提出的問題:

我有一台 web 服務器,帶有安全的 api 端點——在使用它們之前,必須先通過 Google 的身份驗證。 我為此實現了ChallengeCallback端點。

這適用於帶有我的 SPA web 前端的瀏覽器。 用戶被重定向到谷歌網站進行登錄,然后被重定向回我的 webapp; 然后瀏覽器擁有經過身份驗證的 cookies 並且 webapp 可以使用端點更新其 state。

我還有一個 WPF 應用程序,它將與 web 服務器通信。 I want the WPF application to do the same as the web front-end: Use the web api endpoints after being authenticated with Google. WPF 應用程序和我的 web 服務器之間的連接是通過 HttpClient 完成的。

我的問題是我不知道如何驗證 WPF 應用程序和 web 服務器之間的 HttpClient 連接。

我嘗試使用相同的Challenge端點,但我得到的響應當然是來自 Google 登錄頁面的 HTML,所以我想我不能將它與 HttpClient 一起使用......

我還嘗試使用 WPF 應用程序中的 GoogleApis 進行身份驗證,並使用經過身份驗證的令牌在HttpClient中設置 cookies 但顯然這不兼容。

如何使用 Google 等外部提供商驗證與 web api 的 HttpClient 連接?


原始問題:

從 WPF 應用程序中,用戶使用以下代碼向 Google 進行身份驗證:

using Google.Apis.Auth.OAuth2;
...
public void Authenticate()
{
    UserCredential credential = GoogleWebAuthorizationBroker.AuthorizeAsync(
        new ClientSecrets
        {
            ClientId = "myClientId",
            ClientSecret = "myClientSecret"
        },
        new[] { "email", "openid" },
        "user",
        CancellationToken.None).Result;
}

這有效,並且UserCredential object 包含經過身份驗證的令牌:

在此處輸入圖像描述

如何將此令牌信息嵌入到使用HttpClient發出的 web 請求中以調用我的 webapi 端點?

我認為請求必須包含一些 cookies 以通知服務器它已通過身份驗證,但我不知道具體是哪些。

服務器端的端點在 IdentityServer 的幫助下驗證用戶是否經過身份驗證:

var result = await HttpContext.AuthenticateAsync(IdentityServer4.IdentityServerConstants.ExternalCookieAuthenticationScheme);
if (result?.Succeeded != true)
{
    throw new Exception("External authentication error");
}

如果我的問題正確,您只需設置Authorization header

var credentials = await GoogleWebAuthorizationBroker.AuthorizeAsync(
        clientSecrets,
        new[] { "email", "openid" },
        "user",
        CancellationToken.None);

_httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue(
        credentials.Token.TokenType, 
        credentials.Token.IdToken);

也許您會在下面找到一個有用的提示,以更好地理解 OpenID:)

混淆源於混合了 GoogleApis 和 IdentityServer 框架。 可以使用其中任何一個來實現身份驗證/授權。 Google.Apis.Auth.OAuth2 和 IdentityServer4 命名空間中的對象並非旨在交互。 當然,不需要手動處理 cookie。

問問自己,Google 為用戶提供了對誰的信任。 如果它回調 WPF,那么 webapi 信任 WPF 是一個單獨的問題。

您在問題中回答自己的問題:

然后瀏覽器具有經過身份驗證的 cookies 並且 webapp 可以使用端點更新其 state

HttpClient 需要發送相同的 cookies。 如何在 HttpClient 的 HttpRequestMessage 上設置 cookie

如果我正確理解了您的問題,那么不久前我遇到了同樣的問題。

我實現它的方式是,在后端,無論誰嘗試訪問端點,他們都必須發送一個Bearer X授權令牌。 令牌包含想要訪問資源的客戶端的身份,我檢查了他是否被允許。

無論哪種客戶端想要訪問端點,它只需要在他發送的請求中具有該授權 header 並且后端將對其進行相同處理。

在我的場景中,我使用了一個身份驗證服務,該服務使用包含身份信息的某個 JWT 向客戶端返回一個 cookie。 然后從客戶端發送每個請求 JWT 從身份驗證服務收到作為授權 header 到后端。

我必須將從服務中收到的 JWT 放在 header 中的原因是身份驗證服務和后端服務不在同一個域中,因此可以共享 Z55E7DD3016CE4AC57B9A0F56AF12F7C2。

這導致這樣的設計,無論您如何驗證客戶端,最終結果都必須是后端可以接收和讀取的某種令牌。

希望這可以幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM