我在.NET Core 2.2框架的顶部有一个用C#
编写的控制台应用程序。
我正在尝试使用我的应用连接Google My Business API以创建posts。
但是每次我尝试调用REST API时,都会出现以下错误
请求具有无效的身份验证凭据。预期的OAuth 2 访问令牌,登录cookie或其他有效的身份验证凭据。 看到 https://developers.google.com/identity/sign-in/web/devconsole-project。
该代码以前可以运行,但是由于某种奇怪的原因,它停止了!
这是一个示例,在该示例中,我获取身份验证令牌,然后调用API以获取Google accounts的列表。
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旁边,标题中还应该传递其他内容吗?
答案 0 :(得分:3)
原来是GoogleWebAuthorizationBroker.AuthorizeAsync()
返回了一个过期的令牌!如果API返回一条消息,指出令牌已过期,那将非常有帮助!
要解决此问题,我使用AccessToken
方法来获取访问令牌,而不是手动访问credential.Token.AccessToken
(即await Credential.GetAccessTokenForRequestAsync()
)。
Credential.GetAccessTokenForRequestAsync()
方法在每次调用时都返回有效令牌。换句话说,如果令牌已过期,它将使用刷新令牌来生成一个新令牌。否则,它将返回现有的未过期令牌。
我将“授权”标头更改为此
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", await Credential.GetAccessTokenForRequestAsync());