我有一个在 .NET Core 2.2 框架之上用 C#
编写的控制台应用程序。
我正在尝试使用我的应用连接 Google 我的商家 API 以创建 posts .
但是每次我尝试调用 REST API 时都会收到以下错误
Request had invalid authentication credentials. Expected OAuth 2 access token, login cookie or other valid authentication credential. See https://developers.google.com/identity/sign-in/web/devconsole-project.
该代码之前可以运行,但由于某种奇怪的原因,它停止了!
这是一个示例,我获取身份验证 token ,然后调用 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();
}
我能够毫无问题地进行身份验证并获取访问 token 。但是,由于某种原因,第二次调用 API 失败。
如何正确调用Google API?除了 AccesToken 之外,还应该在 header 中传递其他内容吗?
最佳答案
结果是 GoogleWebAuthorizationBroker.AuthorizeAsync()
返回了过期的 token !如果 API 返回一条消息,指出 token 已过期,那将会非常有帮助!
为了解决此问题,我没有手动访问 AccessToken
(即 credential.Token.AccessToken
),而是使用 await Credential.GetAccessTokenForRequestAsync()
获取访问 token 的方法。
Credential.GetAccessTokenForRequestAsync()
方法每次调用时都会返回有效 token 。换句话说,如果 token 过期,它会使用刷新 token 生成新 token 。否则,它返回现有的未过期 token 。
我将我的授权 header 更改为此
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", await Credential.GetAccessTokenForRequestAsync());
关于c# - 请求的身份验证凭据无效。需要 OAuth 2 访问 token 、登录 cookie 或其他有效的身份验证凭据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56828674/