我在.NET Core 2.2 Framework的顶部编写了一个带有C#
的控制台应用程序。
我正在尝试使用我的应用程序连接Google我的业务API来创建帖子。
但是,每次我尝试调用REST API时,我都会收到以下错误
请求具有无效的身份验证凭证。预期的Oauth 2 访问令牌,登录cookie或其他有效的身份验证凭据。 看 https://developers.google.com/indistity/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旁边,还有其他内容应该在标题中传递吗?
事实证明, GoogleWebAuthorizationBroker.AuthorizeAsync()
正在返回过期的令牌!如果API返回一条消息,说令牌已过期!
要解决问题,而不是手动访问AccessToken
(即credential.Token.AccessToken
(,我使用了await Credential.GetAccessTokenForRequestAsync()
方法来获取访问令牌。
Credential.GetAccessTokenForRequestAsync()
方法随时返回有效的令牌。换句话说,如果令牌已过期,它会使用刷新式来生成新的。否则,它返回现有的非预期令牌。
我将我的授权标题更改为此
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", await Credential.GetAccessTokenForRequestAsync());