首页 > 解决方案 > 如何验证与外部提供商 (Google) 的 HttpClient 连接

问题描述

编辑:

这是我重新提出的问题:

我有一个带有安全 api 端点的网络服务器——在使用它们之前必须通过谷歌的身份验证。我为此实现ChallengeCallback端点。

这在带有我的 SPA Web 前端的浏览器中运行良好。用户被重定向到谷歌网站进行登录,然后被重定向回我的 webapp;然后浏览器拥有经过身份验证的 cookie,并且 webapp 可以使用端点来更新其状态。

我还有一个将与 Web 服务器通信的 WPF 应用程序。我希望 WPF 应用程序与 Web 前端一样:在通过 Google 身份验证后使用 Web api 端点。WPF 应用程序和我的 Web 服务器之间的连接是通过 HttpClient 完成的。

我的问题是我不知道如何验证 WPF 应用程序和 Web 服务器之间的 HttpClient 连接。

我尝试使用相同的Challenge端点,但我得到的响应当然是来自 Google 登录页面的 HTML,所以我想我不能将它与 HttpClient 一起使用......

我还尝试从 WPF 应用程序使用 GoogleApis 进行身份验证,并使用经过身份验证的令牌在其中设置 cookie,HttpClient但显然这不兼容。

如何使用 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对象包含经过身份验证的令牌:

在此处输入图像描述

如何将此令牌信息嵌入到使用 an 发出的 Web 请求HttpClient中以调用我的 webapi 端点?

我认为请求必须包含一些 cookie 以通知服务器它已经过身份验证,但我不知道具体是哪些。

服务器端的端点在 IdentityServer 的帮助下验证用户是否经过身份验证:

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

标签: c#.netasp.net-web-apiopenidgoogle-authentication

解决方案


如果我的问题正确,您只需设置Authorization标题

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

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

推荐阅读