我的Google Drive集成网络应用程序适用于drive
范围,但除非必要,否则使用如此广泛的范围是不好的做法。我想将范围限制为drive.file
,以便我只能访问应用程序创建的文件以及使用Google Picker打开的文件,但我无法让它工作。
应用程序创建的文件可以毫无问题地打开。但是,使用Google Picker打开的文件无法访问;尝试下载此类文件会导致404错误。当我右键点击Google云端硬盘中的文件并选择“查看授权的应用”时,我的应用程序未被列为授权应用之一。
如果范围扩展到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();
}
}
A related question认为应用ID设置不正确。这似乎不会影响我;我已经测试了所有我能想到的组合而没有任何运气。
答案 0 :(得分:2)
OP的回答中提到的Google+加上对话为我提供了关键。必须正确配置许多内容才能使其正常工作:
上面的一个子集可能会起作用,但这是我需要设置的,以便对选择的文件的简单REST请求以200而不是404返回。
答案 1 :(得分:1)
首先提出in a Google+ conversation,问题可以解决如下:
答案 2 :(得分:0)
除了设置应用ID之外,请确保您在提供者选择服务的页面列在API控制台的javascript原点中。应用程序ID 和两者都需要匹配要授权的文件。