Jun*_*ior 2 c# google-api google-oauth google-api-dotnet-client google-my-business-api
C#我有一个在 .NET Core 2.2 框架之上编写的控制台应用程序。
我正在尝试使用我的应用程序连接 Google 我的商家 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();
}
Run Code Online (Sandbox Code Playgroud)
我能够毫无问题地进行身份验证并获取访问令牌。但是,由于某种原因,第二次调用 API 失败。
如何正确调用Google API?除了 AccesToken 之外,还应该在标头中传递其他内容吗?
原来是GoogleWebAuthorizationBroker.AuthorizeAsync()返回了一个过期的token!如果 API 返回一条消息,指出令牌已过期,那将会非常有帮助!
为了解决这个问题,我没有手动访问AccessToken(即),而是使用方法来获取访问令牌。credential.Token.AccessTokenawait Credential.GetAccessTokenForRequestAsync()
该Credential.GetAccessTokenForRequestAsync()方法每次被调用时都会返回一个有效的令牌。换句话说,如果令牌过期,它会使用刷新令牌生成新令牌。否则,它返回现有的未过期令牌。
我将我的授权标头更改为此
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", await Credential.GetAccessTokenForRequestAsync());
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
7399 次 |
| 最近记录: |