【发布时间】:2013-07-04 16:44:49
【问题描述】:
我的 Google Drive 集成网络应用程序在 drive 范围内运行良好,但除非必要,否则使用如此广泛的范围是不好的做法。我想将范围限制为drive.file,以便我只能访问应用程序创建的文件和使用 Google Picker 打开的文件,但我无法让它工作。
应用程序创建的文件可以毫无问题地打开。但是,无法访问使用 Google Picker 打开的文件;尝试下载此类文件会导致 404 错误。当我右键单击 Google Drive 中的文件并选择“查看授权应用程序”时,我的应用程序未列为授权应用程序之一。
如果范围扩大到drive,代码可以正常工作。
我写了一个minimal test page,它应该下载用户在 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();
}
}
related question 得出结论认为应用 ID 设置不正确。这似乎对我没有影响;我已经测试了所有我能想到的组合,但没有任何运气。
【问题讨论】:
-
如果这么简单,我在文档中很幸运。查看:developers.google.com/picker/docs/index#gdata,似乎
scope设置为数组,而不是扁平字符串,例如:scope: ['https://www.googleapis.com/auth/photos']。如果您将代码更改为:scope: ['https://www.googleapis.com/auth/drive.file'],,您的代码是否有效? -
另外,我并不完全清楚范围是如何工作的,但是虽然我看到
drive.file范围被列为 Google Drive 范围,但它并未列在 Google Picker 范围子集中:developers.google.com/picker/docs/index#otherviews问题是否可能仅仅是drive.file不是pickerBuilder()的可用范围?试图从控制台破解,gapi.auth.getToken()返回 null,打破了showPicker()。但这可能是其他原因...... -
好的,所以它从控制台失败了,因为
auth()使用了一个需要解除阻止的弹出窗口。授予后,我得到以下showPicker():Unable to post message to https://docs.google.com. Recipient has origin http://rpg-ambience.com. Invalid 'X-Frame-Options' header encountered when loading 'https://docs.google.com/picker?<blah>': 'ALLOW-FROM http://rpg-ambience.com' is not a recognized directive. The header will be ignored.但是选择器确实加载了,没有下载,但是控制台用downloadItem记录了文件对象的详细信息,所以试试scope:['blah'] -
你有没有成功让选择器与 drive.file 范围一起工作?
-
@pinoyyid:不,到目前为止还没有运气。我考虑开始赏金,但我不确定它是否会有所帮助,因为这是特定于 API 的。发布到官方 Google Drive 开发者社区也没有产生任何解决方案:plus.google.com/108061244596087600297/posts/YcdzVtnXkta
标签: javascript html google-drive-api google-picker