如何使用Google Picker访问使用“;drive.file”;范围

How do I use Google Picker to access files using the "drive.file" scope?

本文关键字:drive file 范围 Google 何使用 Picker 访问      更新时间:2023-09-26

我的Google Drive集成web应用程序在drive范围内运行良好,但除非必要,否则使用如此广泛的范围是不好的做法。我想将范围限制为drive.file,这样我就只能访问应用程序创建的文件和使用Google Picker打开的文件,但我无法使其工作。

应用程序创建的文件可以毫无问题地打开。然而,使用Google Picker打开的文件是不可访问的;尝试下载这样的文件会导致404错误。当我右键单击Google Drive中的文件并选择"查看授权应用程序"时,我的应用程序不会被列为授权应用程序之一。

如果范围扩展到drive,则代码工作正常。

我写了一个最小的测试页面,应该下载用户在谷歌选择器中选择的文件。该过程可以通过调用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设置不正确。这似乎对我没有影响;我已经测试了我能想到的所有组合,但没有任何运气。

OP的回答中提到的Google++对话为我掌握了关键。要想让它发挥作用,需要正确配置许多东西:

  1. 驱动器API和驱动器SDK都已为您的开发人员帐户启用
  2. 选择器上设置的appId与clientId的第一部分匹配,例如("1932384883-qI99fef9f9ghh9n99vvsqa9zxczx8cz8xcc.googleusercontent.com"中的"193238384883")
  3. 在Drive SDK配置中,定义一个Open URL。URL不必与打开选择器的URL完全匹配,而是与原点(例如。https://domain.com)确实如此
  4. 在"web应用程序的客户端ID"部分中,上面的Open URL也必须在重定向URI列表中。原点必须在javascript原点列表中
  5. 您可能还需要用户将您的应用程序"安装"到Google Drive中,或者请求"Drive.install"范围和"Drive.file"

上面的一个子集可能会起作用,但这是我需要设置的,以便对所选文件进行简单的REST请求,返回200而不是404。

正如在Google+对话中首次提出的那样,这个问题可以通过以下方式解决:

  1. 确保在Google开发者控制台中启用了Drive SDK(DriveAPI是其他功能,仅启用是不够的)
  2. 为您的应用程序指定"打开URL"

除了设置应用程序ID外,还要确保为选择器提供服务的页面列在API控制台的javascript源中。应用程序ID和来源都需要匹配才能授权文件。