【问题标题】:Google calendar: "Client is unauthorized to retrieve access tokens using this method, or client not authorized for any of the scopes requested."谷歌日历:“客户未经授权使用此方法检索访问令牌,或者客户未获得任何请求范围的授权。”
【发布时间】:2021-04-10 01:04:24
【问题描述】:
  1. 我们通过了验证,开始在 breess.com 服务上使用calendar.events.readonly 范围。

  2. 我们创建了具有广泛授权的服务帐户

  3. 在 G Suite 域的管理控制台中添加范围 https://www.googleapis.com/auth/calendar.events.readonly

  4. 用户帐户xxxxx@xxx.com 授予访问他的日历的权限

一切看起来都配置好了。下面的代码在宿主机上执行并返回错误:

错误:“unauthorized_client”,描述:“客户端未经授权无法使用此方法检索访问令牌,或客户端未获得任何请求范围的授权。”,Uri:“”

我们错过了什么吗?您能否指导我们解决问题?

补充说明:

var credential = GoogleCredential
.FromFile("breess-7798c393d5b0.json")
.CreateScoped(new[] { CalendarService.Scope.CalendarEventsReadonly })
.createwithuser("xxx@xxx.xxx");
var calendarService = new CalendarService(new     BaseClientService.Initializer { HttpClientInitializer = credential, ApplicationName = "BREESS" });
var request = calendarService.Events.List(calendarId);
var events = await request.ExecuteAsync();

【问题讨论】:

  • 凭据中的client id 是否与服务帐户中的unique id 对应?

标签: c# google-api google-calendar-api google-api-dotnet-client service-accounts


【解决方案1】:

客户端未经授权无法使用此方法检索访问令牌,或者客户端未获得任何请求范围的授权。

通过 google 授权 Oauth 有三种方式。他们每个人都有自己类型的凭据文件和使用它们所需的代码。

  1. 已安装的应用程序
  2. 网络应用程序
  3. 服务帐号申请
  4. API 密钥仅供公共访问

当您在 Google 开发者控制台上创建项目时,您需要确保您已创建服务帐户凭据。然后,您需要确保您使用的是旨在与服务帐户凭据一起使用的代码

var scopes = new[] { CalendarService.Scope.CalendarEventsReadonly }
GoogleCredential credential;
using (var stream = new FileStream(serviceAccountCredentialFilePath, FileMode.Open, FileAccess.Read))
                    {
                        credential = GoogleCredential.FromStream(stream)
                             .CreateScoped(scopes);
                    }
  credential.User = "domainuser@yourdomain.com";
 // Create the  Calendar service.
 return new CalendarService(new BaseClientService.Initializer()
         {
         HttpClientInitializer = credential,
         ApplicationName = "Calendar Service account Authentication Sample",
         }
  );

我没有发现您的代码有任何重大错误,因此我怀疑问题是您没有正确类型的凭据文件。

【讨论】:

  • @DalmTo 正如我在上面提到的,已创建服务帐户,并为此服务帐户启用了广泛委派。 breess-7798c393d5b0.json 凭据文件是在创建服务帐户时导出的。
  • 您收到的消息清楚地表明您是“客户端未经授权使用此方法检索访问令牌”,这意味着 client.json 文件不是服务帐户,因此无法使用设计的代码用于使用服务帐户进行身份验证。
  • 这里是凭证文件内容:{ "type": "service_account", "project_id": "breess", "private_key_id": "...", "private_key": "... ","client_email":"xxx@breess.iam.gserviceaccount.com","client_id":"102xxxxxxxxxxxxxxx163","auth_uri":"accounts.google.com/o/oauth2/auth","token_uri":"oauth2.googleapis.com/token","auth_provider_x509_cert_url": "googleapis.com/oauth2/v1/certs", "client_x509_cert_url": "googleapis.com/robot/v1/metadata/x509/…" }
  • 您能否在不添加 credential.User 的情况下再试一次,以便我们可以看到您的服务帐户实际上正在使用我提供的代码。那么这可能是您的授权问题。
  • 然后 Google API 没有模拟返回“未找到 [404] 错误 [消息[未找到] 位置 [-] 原因 [未找到] 域 [全局]]”。
猜你喜欢
  • 1970-01-01
  • 2020-04-30
  • 2022-09-19
  • 2018-12-01
  • 2015-02-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-14
相关资源
最近更新 更多