Google Drive OAuth 2流程提供invalid_scope错误

时间:2013-05-19 09:41:56

标签: google-drive-api

我的Google云端硬盘应用在交换访问令牌代码时会请求以下范围:

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云端硬盘点击以创建新文档时才会出现此错误。如果我从我自己的应用程序启动身份验证/授权流程,则可以接受范围列表。如果用户点击实际的云端硬盘应用来创建新文档,我会收到invalid_scopes。

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

4 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:1)

您可能在两个身份验证之间使用标签而不是空格

  

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

推出新行以显示标签

总是在这两个链接之间使用一个空格来进行授权。

这发生在我身上。

答案 2 :(得分:0)

新的google api(在发布此答案的那一刻)要求scope属性为一个字符串,范围以空格分隔。所以喜欢这个

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 (...)

答案 3 :(得分:0)

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