【问题标题】:How do I use Google Picker to access files using the "drive.file" scope?如何使用 Google Picker 访问使用“drive.file”范围的文件?
【发布时间】: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


【解决方案1】:

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

【讨论】:

  • 对于这个测试页面,我提供了应用程序 ID 作为字符串给出的数字序列(我的客户端 ID 没有 .apps.googleusercontent.com),我在 API 控制台中的来源为 http://rpg-ambience.com。对于这种情况,这是否正确?
【解决方案2】:

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

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

【讨论】:

  • @bamnet:不幸的是,我还没有尝试过。你有问题吗?
  • Drive SDK 已经不存在了,并且已经折叠到Drive API 中,但是Open URL 设置仍然存在,需要设置,并且您还需要添加一个图标才能保存打开 URL 设置。它位于 Drive API 设置的第三个选项卡中。
【解决方案3】:

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。

【讨论】:

  • Drive SDK 已经不存在了,并且已经折叠到Drive API 中,但是Open URL 设置仍然存在,需要设置,并且您还需要添加一个图标才能保存打开 URL 设置。它位于 Drive API 设置的第三个选项卡中。
  • 调用 .setAppId() 对我在不同于开放 URL 的域上运行至关重要。
  • @Femi 不能对您的评论给予足够的支持,setAppId 对我来说也是关键。
猜你喜欢
  • 2013-06-11
  • 1970-01-01
  • 1970-01-01
  • 2020-08-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-10
  • 1970-01-01
相关资源
最近更新 更多