我的基于Google Drive的Web应用程序可以使用drive
权限范围正常工作,但是除非必要,否则这样使用广泛的范围是不好的实践。我想将范围限制为drive.file
,以便只能访问由应用程序创建和使用Google Picker打开的文件,但我无法使其正常工作。
由应用程序创建的文件可以正常打开。然而,使用Google Picker打开的文件无法访问;尝试下载此类文件会导致404错误。当我在Google Drive中右键单击文件并选择“查看授权应用程序”时,我的应用程序未列为已授权应用程序之一。
如果将范围扩展到drive
,代码将正常工作。
我编写了一个最小化测试页面,该页面应下载用户在Google Picker中选择的文件。可以通过调用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设置不正确。这似乎并不影响我;我已经测试了我能想到的所有组合,但没有任何运气。
drive.file
范围列在 Google Drive 范围中,但它没有列在 Google Picker 范围子集中: https://developers.google.com/picker/docs/index#otherviews。这个问题可能仅仅是因为drive.file
不是pickerBuilder()
的可用范围吗? 试图从控制台进行黑客攻击,gapi.auth.getToken()
返回 null,导致showPicker()
失败。 但这可能是其他原因... - Anthonyauth()
使用了一个弹出窗口,需要解除阻止。授权后,我使用showPicker()
得到以下结果:无法将消息发布到https://docs.google.com。接收者的来源为http://rpg-ambience.com。在加载'https://docs.google.com/picker?<blah>'时遇到无效的'X-Frame-Options'头文件:'ALLOW-FROM http://rpg-ambience.com'不是一个被认可的指令。该头文件将被忽略。
但是选择器确实加载了,并且没有下载,但控制台记录了文件对象详细信息,因此尝试使用scope:['blah']
。 - Anthony