【问题标题】:Google Drive OAuth 2 flow giving invalid_scope errorGoogle Drive OAuth 2 流程给出 invalid_scope 错误
【发布时间】:2021-07-16 15:58:41
【问题描述】:

我的 Google Drive 应用在交换访问令牌的代码时请求以下范围:

https://www.googleapis.com/auth/drive.file
https://www.googleapis.com/auth/userinfo.email
https://www.googleapis.com/auth/userinfo.profile
https://www.googleapis.com/auth/drive.install

具体来说,这是在交换期间最终从 Google 请求的 URL 的查询字符串:

code=XXXXXXXXXX&grant_type=authorization_code&redirect_uri=XXXXXXXXXXX& scope=https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fdrive.file+ https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fuserinfo.email +https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fuserinfo.profile +https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fdrive.install &client_id=XXXXXX.apps.googleusercontent.com&client_secret=XXXXXX

响应为 400 错误,错误消息为“invalid_scope”。我做错了什么?

[编辑] 附加信息:

只有当用户从 Google Drive 中点击以创建新文档时,才会发生该错误。如果我从自己的应用程序启动身份验证/授权流程,范围列表就可以接受。如果用户点击实际的 Drive 应用程序来创建新文档,我会得到 invalid_scopes。

无效范围是 drive.install。如果我在用户出现以创建新文档时从请求的范围列表中删除它,事情就会重新开始工作。这有任何意义吗?如果用户已经通过我们请求该范围安装了 Drive 应用,为什么当用户从 Drive 应用出现时请求相同的范围会导致任何类型的问题?

【问题讨论】:

  • 嗨,本,这是新的吗?我无法使用 OAuth2 Playground 重现这一点。 developers.google.com/oauthplayground可以试试吗?
  • 在 OAuth Playground 中,POST 数据实际上不包含任何作用域,并且成功:code=4%2FzVoxcbiMw77zguVnfeuiUoGM8gSy.8pi045fH2jofMqTmHjyTFGP0BoOAfQI&redirect_uri=https%3A%2F%2Fdevelopers.google.com%2Foauthplayground&_id= 407408718192.apps.googleusercontent.com&scope=&client_secret=************&grant_type=authorization_code 重点是,我的 Java 库错了吗?我不应该将任何范围传递给代码交换过程吗?
  • 是的,不应发送范围进行代码交换。如果是您自己的图书馆,请不要填写。
  • 这是 Google 提供的 OAuth 库 (com.google.api.client.auth.oauth2...) 事实证明,我只在 drive.install 范围内收到此错误,而不是其他任何错误范围。我尝试不将范围发送到代码交换,但随后我得到了一个没有权限的令牌,正如我所预料的那样。但是通过离开 drive.install,事情又开始了。我是唯一一个看到这种行为的人吗?
  • @BenDilts,我无法重现您的问题。是否可以提供代码sn-ps?

标签: google-drive-api


【解决方案1】:

我遇到了类似的问题。解决方案是将一系列范围传递给谷歌客户端:

google_client.authorization.scope=[
'https://www.googleapis.com/auth/calendar.readonly',
'https://www.googleapis.com/auth/drive.appdata'] 

而不是串联的范围字符串

google_client.authorization.scope="https://www.googleapis.com/auth/calendar.readonly%2Bhttps://www.googleapis.com/auth/drive.appdata" 

Rails 日志中的 GET 请求看起来相同,但结果却大不相同!

【讨论】:

    【解决方案2】:

    您可能会在两个类似身份验证之间使用 tab 而不是 space

    https://www.googleapis.com/auth/calendar.readonly https://www.googleapis.com/auth/drive.appdata

    换行显示标签

    在这两个授权链接之间始终使用一个空格。

    这件事发生在我身上。

    【讨论】:

      【解决方案3】:

      新的 google api(在发布此答案时)要求范围属性是一个字符串,并且范围用空格分隔。就这样

      var SCOPES = "https://www.googleapis.com/auth/drive https://www.googleapis.com/auth/gmail.send";
      
      gapi.auth2.init({
           client_id:CLIENT_ID,
           scope: SCOPES
      }).then (...)
      

      【讨论】:

        【解决方案4】:

        您可以尝试不转义 + 符号。这对我们有用。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2018-05-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-05-03
          • 2018-03-10
          • 2013-10-17
          • 1970-01-01
          相关资源
          最近更新 更多