6

在交换访问令牌的代码时,我的 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 应用程序出现时请求相同的范围会导致任何类型的问题?

4

4 回答 4

5

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

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 请求看起来相同,但结果却大不相同!

于 2013-08-03T12:37:08.210 回答
4

您有可能在两个身份验证之间使用制表符而不是空格

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

换行以显示标签

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

这发生在我身上。

于 2018-02-23T17:27:22.653 回答
1

新的 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 (...)
于 2017-07-14T12:21:07.353 回答
0

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

于 2021-07-16T07:58:41.203 回答