2

C#我有一个在 .NET Core 2.2 框架之上编写的控制台应用程序。

我正在尝试使用我的应用程序连接 Google My Business API 以创建帖子

但是每次我尝试调用 REST API 时都会出现以下错误

请求具有无效的身份验证凭据。预期的 OAuth 2 访问令牌、登录 cookie 或其他有效的身份验证凭据。请参阅 https://developers.google.com/identity/sign-in/web/devconsole-project

该代码以前可以工作,但由于某种奇怪的原因,它停止了!

这是我获取身份验证令牌然后调用 API 以获取Google 帐户列表的示例。

var credential = await GoogleWebAuthorizationBroker.AuthorizeAsync(new ClientSecrets
{
    ClientId = "Client ID",
    ClientSecret = "Client Secret",
}, new[] { "https://www.googleapis.com/auth/plus.business.manage" }, "google username", CancellationToken.None);

using (var client = new HttpClient())
{   
    //client.DefaultRequestHeaders.Clear();
    client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", credential.Token.AccessToken);
    client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

    var c = await client.GetAsync("https://mybusiness.googleapis.com/v4/accounts");
    var accountContentss = await c.Content.ReadAsStringAsync();
    c.EnsureSuccessStatusCode();
    var accountContent = await c.Content.ReadAsStringAsync();
}

我能够毫无问题地进行身份验证并获取访问令牌。但是,由于某种原因,对 API 的第二次调用失败。

如何正确调用 Google API?除了 AccesToken 之外,还有其他东西应该在标头中传递吗?

4

1 回答 1

4

原来GoogleWebAuthorizationBroker.AuthorizeAsync()是返回一个过期的令牌!如果 API 返回一条说明令牌已过期的消息,那将非常有帮助!

为了解决这个问题,我没有AccessToken手动访问(即,credential.Token.AccessToken),而是使用await Credential.GetAccessTokenForRequestAsync()方法来获取访问令牌。

Credential.GetAccessTokenForRequestAsync()方法在任何时候被调用都会返回一个有效的令牌。换句话说,如果令牌过期,它会使用刷新令牌生成一个新令牌。否则,它返回现有的未过期令牌。

我将我的授权标头更改为此

client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", await Credential.GetAccessTokenForRequestAsync());
于 2019-07-01T00:41:25.663 回答