如何使用Google Picker访问使用“;drive.file”;范围
How do I use Google Picker to access files using the "drive.file" scope?
我的Google Drive集成web应用程序在drive
范围内运行良好,但除非必要,否则使用如此广泛的范围是不好的做法。我想将范围限制为drive.file
,这样我就只能访问应用程序创建的文件和使用Google Picker打开的文件,但我无法使其工作。
应用程序创建的文件可以毫无问题地打开。然而,使用Google Picker打开的文件是不可访问的;尝试下载这样的文件会导致404错误。当我右键单击Google Drive中的文件并选择"查看授权应用程序"时,我的应用程序不会被列为授权应用程序之一。
如果范围扩展到drive
,则代码工作正常。
我写了一个最小的测试页面,应该下载用户在谷歌选择器中选择的文件。该过程可以通过调用auth()
然后调用showPicker()
来启动。代码的关键部分如下:
gapi.auth.authorize({
client_id: '123456789012.apps.googleusercontent.com',
scope: 'https://www.googleapis.com/auth/drive.file',
immediate: false
});
...
var picker = new google.picker.PickerBuilder()
.setAppId('123456789012')
.addView(new google.picker.DocsView(google.picker.ViewId.DOCS_IMAGES))
.setOAuthToken(gapi.auth.getToken().access_token)
.setCallback(onPickerAction)
.build();
picker.setVisible(true);
...
function onPickerAction(data) {
if ( data.action === google.picker.Action.PICKED ) {
var id = data.docs[0].id;
var request = new XMLHttpRequest();
request.open('GET', 'https://www.googleapis.com/drive/v2/files/' + id);
request.setRequestHeader('Authorization', 'Bearer ' + gapi.auth.getToken().access_token);
request.addEventListener('load', function() {
var item = JSON.parse(request.responseText);
console.log(item);
});
request.send();
}
}
相关问题的结论是应用程序ID设置不正确。这似乎对我没有影响;我已经测试了我能想到的所有组合,但没有任何运气。
OP的回答中提到的Google++对话为我掌握了关键。要想让它发挥作用,需要正确配置许多东西:
- 驱动器API和驱动器SDK都已为您的开发人员帐户启用
- 选择器上设置的appId与clientId的第一部分匹配,例如("1932384883-qI99fef9f9ghh9n99vvsqa9zxczx8cz8xcc.googleusercontent.com"中的"193238384883")
- 在Drive SDK配置中,定义一个Open URL。URL不必与打开选择器的URL完全匹配,而是与原点(例如。https://domain.com)确实如此
- 在"web应用程序的客户端ID"部分中,上面的Open URL也必须在重定向URI列表中。原点必须在javascript原点列表中
- 您可能还需要用户将您的应用程序"安装"到Google Drive中,或者请求"Drive.install"范围和"Drive.file"
上面的一个子集可能会起作用,但这是我需要设置的,以便对所选文件进行简单的REST请求,返回200而不是404。
正如在Google+对话中首次提出的那样,这个问题可以通过以下方式解决:
- 确保在Google开发者控制台中启用了Drive SDK(DriveAPI是其他功能,仅启用是不够的)
- 为您的应用程序指定"打开URL"
除了设置应用程序ID外,还要确保为选择器提供服务的页面列在API控制台的javascript源中。应用程序ID和来源都需要匹配才能授权文件。
相关文章:
- 正在将base64 jpeg从input-type=file上传到服务器
- 有人能告诉我如何在cent-os中打开扩展名为.dat的FIle吗
- File Upload事件上下文和javascript
- 如何确保通过电子邮件发送的html文档中的Google Drive链接不会被识别为附件
- 使用jQuery File Upload实现所需的用户登录
- 无法使用API-node.js从Google Drive下载文件
- FileEntry.file方法使dataTransferItemList为空
- '的文件格式和扩展名;file.xls'don't与fileSaver.js匹配
- 有没有什么方法可以通过输入字段(type=file)来找出选择了多少个文件
- FF和Chrome中的 ftp:// 网页不会加载 file:// 脚本
- 将从浏览器创建的文件保存到磁盘 - 不能在 Firefox 上使用新的 File()
- 如何将标头中的全局变量加载到外部Javascript FIle中
- PrimeFaces p:file上传多个文件自动完成仅在第一个文件后有效
- 使用 Javascript SDK 创建 Parse.File
- Krajee Bootstrap file input dynamic maxFilecount
- Google Drive:通过javascript访问webContentLink
- File Upload & Google Protobuf
- Google Drive SDK JavaScript:上传ppt(x)并将其转换为演示文稿(Google幻灯片)
- Jquery ajax append html file based on url
- 如何使用Google Picker访问使用“;drive.file”;范围