我的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应用程序中显示时,为什么会请求相同的范围会导致任何类型的问题?
答案 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)
您可以尝试不转义 +
符号。这对我们有用。