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

Jak*_*kob 6 html javascript google-drive-api google-picker

我的Google Drive集成Web应用程序可以在drive范围内正常运行,但除非必要,否则使用如此广泛的范围是不好的做法.我想限制范围,drive.file以便我只能访问由应用程序创建的文件和使用Google Picker打开的文件,但我无法使其工作.

可以毫无问题地打开应用程序创建的文件.但是,使用Google Picker打开的文件无法访问; 尝试下载此类文件会导致404错误.当我右键单击Google云端硬盘中的文件并选择"查看授权的应用"时,我的应用程序未被列为授权应用之一.

如果范围扩展到,则代码可以正常工作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();
    }
}
Run Code Online (Sandbox Code Playgroud)

一个相关的问题得出结论,应用程序ID设置不正确.这似乎不会影响我; 我已经测试了所有我能想到的组合而没有任何运气.

ala*_*nde 7

OP 的回答中提到的 Google+ plus 对话对我来说是关键。必须正确配置许多内容才能使其正常工作:

  1. 您的开发者帐户已启用 Drive API 和 Drive SDK。
  2. 选择器上设置的 appId 与 clientId 的第一部分匹配,例如(“1932384883-qI99fef9f9ghh9n99vvsqa9zxczx8cz8xcc.googleusercontent.com”中的“1932384883”)
  3. 在 Drive SDK 配置中,定义一个开放 URL。URL 不必与打开选取器的 URL 完全匹配,但源地址(例如https://domain.com)可以。
  4. 在“Web 应用程序的客户端 ID”部分中,上面的打开 URL 也必须位于重定向 URI 列表中。来源必须位于 javascript 来源列表中。
  5. 您可能还需要要求用户将您的应用“安装”到 Google 云端硬盘中,或请求“drive.install”范围以及“drive.file”

上面的一部分可能有效,但这就是我需要设置的,以便对所选文件进行简单的 REST 请求返回 200 而不是 404。

  • 调用 `.setAppId()` 对于我来说至关重要,因为它可以在与 Open URL 不同的域上运行。 (6认同)

Jak*_*kob 1

正如Google+ 对话中首先建议的那样,该问题可以通过以下方式解决:

  1. 确保在 Google 开发者控制台中启用了 Drive SDK(Drive API是其他东西,仅启用它是不够的)。
  2. 为您的应用程序指定一个“打开 URL”。