代码之家  ›  专栏  ›  技术社区  ›  Bruno

使用HttpClient对Google进行身份验证

  •  0
  • Bruno  · 技术社区  · 6 年前

    以下是我重新提出的问题:

    Challenge 和 Callback 它的端点。

    这在我的SPA web前端的浏览器上运行得很好。用户被重定向到Google网站进行登录,然后被重定向回mywebapp;然后浏览器有经过身份验证的cookies,webapp可以使用端点来更新其状态。

    我希望WPF应用程序与web前端一样:在通过Google认证之后使用webapi端点。WPF应用程序和web服务器之间的连接是通过HttpClient完成的。

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

    但是我得到的响应当然是来自Google登录页面的HTML,所以我想我不能在HttpClient上使用它。。。

    我还尝试使用WPF应用程序中的googleapi进行身份验证,并使用经过身份验证的令牌在 HttpClient 但显然这是不相容的。

    如何使用外部提供者(如Google)验证HttpClient到webapi的连接?


    原题:

    在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 对象包含已验证的令牌:

    enter image description here

    如何在使用 HttpClient 为了调用我的webapi端点?

    我认为请求必须包含一些cookies来通知服务器它已经被认证,但是我不知道到底是哪一个。

    var result = await HttpContext.AuthenticateAsync(IdentityServer4.IdentityServerConstants.ExternalCookieAuthenticationScheme);
    if (result?.Succeeded != true)
    {
        throw new Exception("External authentication error");
    }
    
    0 回复  |  直到 6 年前
        1
  •  2
  •   Leff    6 年前

    如果我答对了你的问题,你只要把 Authorization 页眉

    var credentials = await GoogleWebAuthorizationBroker.AuthorizeAsync(
            clientSecrets,
            new[] { "email", "openid" },
            "user",
            CancellationToken.None);
    
    _httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue(
            credentials.Token.TokenType, 
            credentials.Token.IdToken);
    
        2
  •  0
  •   Victor Popescu    6 年前

    也许您会在下面找到一个帮助您更好地理解OpenID的提示:)

    可以使用它们中的任何一个来实现身份验证/授权。 对象来自Google.api.Auth.OAuth2和IdentityServer4命名空间不是为交互而设计的。 当然,不需要手动处理cookie。

    问问你自己,谷歌向谁提供了用户的信任。如果它调用WPF,那么webapi信任WPF是一个单独的问题。

        3
  •  0
  •   Rhyous    6 年前

    你在问题中回答自己的问题:

    更新其状态的端点

    How do I set a cookie on HttpClient's HttpRequestMessage

        4
  •  0
  •   Max    6 年前

    如果我对你的问题理解正确,那么不久前我也面临同样的问题。

    Bearer X 授权令牌。 令牌包含了想要访问资源的客户机的身份,我检查了他是否被允许。

    无论什么类型的客户机想要访问端点,它只需要在他发送的请求中包含authorization头,后端将对其进行相同的处理。

    然后,我从客户机将JWT从身份验证服务收到的每个请求作为授权头发送到后端。

    我必须将从服务接收到的JWT放在一个头中,原因是身份验证服务和后端服务不在同一个域中,所以cookies无法共享。

    希望这有帮助。