请求包含无效的身份验证凭据。预期的OAuth 2访问令牌,登录cookie或其他有效的身份验证凭据

时间:2019-06-30 23:15:42

标签: c# google-api google-oauth google-api-dotnet-client google-my-business-api

我在.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旁边,标题中还应该传递其他内容吗?

1 个答案:

答案 0 :(得分:3)

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

要解决此问题,我使用AccessToken方法来获取访问令牌,而不是手动访问credential.Token.AccessToken(即await Credential.GetAccessTokenForRequestAsync())。

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

我将“授权”标头更改为此

client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", await Credential.GetAccessTokenForRequestAsync());