c# - 请求的身份验证凭据无效。需要 OAuth 2 访问 token 、登录 cookie 或其他有效的身份验证凭据

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

我有一个在 .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/

相关文章:

ios - 如何仅以英文获取 Googleapis 响应?

java - 将一次性代码交换为刷新 token 时出现 Google OAuth redirect_uri_mismatch

c# - 未处理的 C# 异常

c# - 异常调用堆栈被截断而没有任何重新抛出

c# - 如何将 List<string> 转换为 List<myEnumType>?

google-api - 获取为特定用户创建的 Google 日历事件列表

c# - 如何将自定义部分添加到 TFS Build 2015 中的构建摘要?

google-api - 关于Google Drive的限制范围的问题

php - 使用 Google Oauth 2.0 进行登录和权限管理是个好主意吗?

android - 无法在 Cross Client google oauth2.0 中交换访问 token 和刷新 token 的授权码