使用记录范围时,Google 保留 API 以无效范围响应

Posted

技术标签:

【中文标题】使用记录范围时,Google 保留 API 以无效范围响应【英文标题】:Google keep api responds with invalid scope when using documented scopes 【发布时间】:2022-01-15 14:13:51 【问题描述】:

以上问题

我正在尝试使用 vb.net window forms application 获取访问令牌以从我自己的 Google 帐户中读取数据。我错过了什么吗?

为什么要打开浏览器进行授权?我只需要访问我自己的数据。

窗体代码

Private Async Sub GetToken()
    Dim scopes As New List(Of String)
    scopes.Add(KeepService.Scope.Keep)

    Dim stream = New FileStream("file path.json", FileMode.Open)
    Dim _userCredentials As UserCredential = 
        Await Google.Apis.Auth.OAuth2.GoogleWebAuthorizationBroker.AuthorizeAsync(
        GoogleClientSecrets.Load(stream).Secrets, scopes, "user", System.Threading.CancellationToken.None)
End Sub

错误详情

授权错误错误 400:invalid_scope 一些请求的范围 无法显示:[https://www.googleapis.com/auth/keep]

【问题讨论】:

这表示范围无效,请尝试使用profile 之类的方法 这很好,但它可以让我以 API 管理员的身份下载我自己的数据吗? 您要下载什么类型的数据?是否有一个部分可以让您查看已注册的应用程序并在其中查看定义了哪些范围? 下载数据是次要工作,首先,谷歌甚至不允许我使用自己的 api 凭据授权自己的 api。似乎没有这样的 google api 可以让我在没有基于网络浏览器的身份验证的情况下下载我自己的 google Keep 数据。 @Pankaj 没有用户交互称为服务帐户授权。这与您现在使用 Oauth2 授权用户的操作完全不同。据我所知,这是与您尝试使用的授权类型无关的 api 错误。 【参考方案1】:

如果我们查看 Notes.list 方法的文档,您会注意到它声明您需要使用以下范围之一

我已经用下面的 C# 代码测试过了

 var credential = await GoogleWebAuthorizationBroker.AuthorizeAsync(GoogleClientSecrets.FromFile(clientSecretJson).Secrets,
                new []KeepService.ScopeConstants.KeepReadonly, KeepService.ScopeConstants.Keep,
                "userName",
                CancellationToken.None,
                new FileDataStore("credPath", true));
            
            
            var service = new KeepService(new BaseClientService.Initializer()
            
                HttpClientInitializer = credential,
                ApplicationName = "Google Keep Oauth2 Authentication Sample"
            );

            var notes = await service.Notes.List().ExecuteAsync();

在这两种情况下,我都会收到以下错误消息

正如您从错误消息中看到的那样,该库正在传递记录的正确范围。它是拒绝范围的 Google keep api 本身。

在我看来,这是 api 中的一个错误,我已经在问题跟踪器 210500028 上发布了一个问题

2021 年 12 月 16 日更新:Google 已验证此错误,目前正在内部调查。

工作区

api 上有一个注释。看来它可能仅适用于 Workspace 域帐户。我确实使用普通的 Gmail 帐户以及 Workspace 域帐户对其进行了测试。结果是一样的。

此 API 是企业专用 API,用于在您的域中创建和管理 Keep 笔记,包括解决 CASB 软件发现的问题。

【讨论】:

如果我们只添加电子邮件范围,它就可以工作,但最后我不得不面对权限问题。这是屏幕截图。 i.stack.imgur.com/TeCFQ.png 这不是您可能想要打开一个新问题的原始问题的一部分。确保您授权的用户有权访问工作区域帐户以使用此 api。 Google 现已确认这是一个错误。并且正在内部调查。【参考方案2】:

我之前曾为 Keep API 的问题提供过支持,因为管理员经常遇到此 API 的问题。

目前 Keep API 使用:.../auth/keep 和 .../auth/keep.readonly 范围用于 OAuth。同意屏幕上不允许这些范围。如果您作为域管理员预先批准应用程序的范围或使用服务帐户,则可以对需要保留范围的应用程序进行身份验证:

管理员审批:您可以通过超级管理员Keep is an Enterprise only API进行授权。如果它是一个 Marketplace 应用,您可以通过将来自 Admin console for your domain 的 Keep Scopes 的客户端 ID 列入许可名单来对其进行授权。 服务帐户:作为管理员,您可以授予domain wide delegation to a service account 并且该服务帐户发出模拟用户的调用,在这种情况下,您自己的帐户就是您的目标。这是一个极其特权的调用,因为用户不需要明确地进行身份验证。使用此授权方式时需要allow it on your Admin console。

遵循上述两种方法中的任何一种都应该允许您使用 Keep API 而不会运行到 Invalid Scope 错误消息。

【讨论】:

如何预先批准范围? 您可以通过从应用程序或通过服务帐户授权范围来作为管理员执行此操作,正如我详细说明的那样,您需要构建一个小应用程序来执行授权,使用服务帐户将是最有用,所以我建议这样做。 我检查了没有办法绕过范围或预先批准它们。

以上是关于使用记录范围时,Google 保留 API 以无效范围响应的主要内容,如果未能解决你的问题,请参考以下文章

在 (0 - X) 范围内生成唯一编号,保留历史记录以防止重复

Youtube API CommentThreads 的范围无效 - java

Youtube API CommentThreads的范围无效 - java

Google端点在日志中为GET /提供了无效的HTTP模板/

Google Maps API 密钥在侧面加载时在发布版本中有效,在发布时无效

如何在 C# 中使用服务帐户登录 Google API - 凭据无效