我的 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 Drive 点击创建新文档时才会发生该错误。如果我从自己的应用程序启动身份验证/授权流程,则可以很好地接受范围列表。如果用户单击实际的云端硬盘应用程序来创建新文档,我会得到 invalid_scopes。
无效范围是drive.install。如果当用户出现创建新文档时我从请求范围列表中删除它,事情就会再次开始工作。这有任何意义吗?如果用户已经通过我们请求该范围安装了云端硬盘应用程序,为什么当用户从云端硬盘应用程序出现时请求相同的范围会导致任何类型的问题?
我也遇到过类似的问题。解决方案是将一系列范围传递给谷歌客户端:
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 请求看起来相同,但结果却截然不同!
您可能会在两个身份验证之间使用tab而不是space,例如
https://www.googleapis.com/auth/calendar.readonly https://www.googleapis.com/auth/drive.appdata
换行以显示选项卡
始终在这两个链接之间使用一个空格来进行授权。
这件事发生在我身上。
新的 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 (...)
您可以尝试不转义
+
符号。这对我们有用。
只需在 chrome/chromium 中打开链接即可解决范围错误(但遗憾的是不适用于 Firefox)