如何使用Google Picker使用“drive.file”范围访问文件?

时间:2013-07-07 00:13:26

标签: javascript html google-drive-api google-picker

我的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设置不正确。这似乎不会影响我;我已经测试了所有我能想到的组合而没有任何运气。

3 个答案:

答案 0 :(得分:2)

OP的回答中提到的Google+加上对话为我提供了关键。必须正确配置许多内容才能使其正常工作:

  1. 为您的开发者帐户启用了Drive API和Drive SDK。
  2. 选择器上设置的appId与clientId的第一部分匹配,例如('1932384883'in'1932384883-qI99fef9f9ghh9n99vvsqa9zxczx8cz8xcc.googleusercontent.com')
  3. 在Drive SDK配置中,定义一个Open URL。该URL不必与打开选择器的URL完全匹配,但原点(例如https://domain.com)确实匹配。
  4. 在“Web应用程序的客户端ID”部分中,上面的“打开URL”也必须位于重定向URI列表中。原点必须在javascript起源列表中。
  5. 您可能还需要用户将您的应用“安装”到Google云端硬盘中,或者请求“drive.install”范围以及“drive.file”
  6. 上面的一个子集可能会起作用,但这是我需要设置的,以便对选择的文件的简单REST请求以200而不是404返回。

答案 1 :(得分:1)

首先提出in a Google+ conversation,问题可以解决如下:

  1. 确保在Google开发者控制台中启用了云端硬盘SDK(云端硬盘 API 是其他内容,仅启用了此功能)。
  2. 指定"打开网址"为您的申请。

答案 2 :(得分:0)

除了设置应用ID之外,请确保您在提供者选择服务的页面列在API控制台的javascript原点中。应用程序ID 两者都需要匹配要授权的文件。