【问题标题】:Shared file user can't access files using drive.file scope In google drive API共享文件用户无法在谷歌驱动器 API 中使用 drive.file 范围访问文件
【发布时间】:2019-12-04 08:44:03
【问题描述】:

当共享用户在 App 中登录时。共享文件无法访问。 API 返回“未找到文件”。

var SCOPES = ["https://www.googleapis.com/auth/drive.file", "profile"];
function createPermissions(fileId, body) {
  gapi.client.load("drive", "v3", function() {
    gapi.client.drive.permissions
      .create({
        fileId: fileId,
        resource: body
      })
      .then(function(res) {
        //console.log(res);
        Swal.fire("Success!", "File has been success shared!", "success");
        // do something
      })
      .catch(function(err) {
        //console.log(err);
        Swal.fire({
          icon: "error",
          title: "Oops...",
          text: "Something went wrong! Plese try agian later!!",
          footer: ""
        });
        // do something
      });
  });
}

上述代码工作正常,文件已成功共享,但共享用户收到共享文件的电子邮件通知,当共享用户单击共享文件时,电子邮件文件可在谷歌驱动器中访问。即:Manoj(应用程序所有者)在 google APP(google drive API)中上传文件并与“Rigal”共享文件。 Rigal 收到共享文件电子邮件通知,并且文件也在他的谷歌驱动器中显示(访问)。但是当 Rigal 登录应用程序(谷歌驱动 API)时,他无法查看(访问)共享文件。 谢谢

【问题讨论】:

  • 如果 Manoj 在不使用 API 的情况下手动与 Rigal 共享文件,您是否会遇到同样的问题?当共享用户在电子邮件中单击指向已与他共享的文件的链接时,文件/他的驱动器是否正在使用与文件共享的相同帐户打开?或者用户可能有第二个帐户?
  • 您好,@ziganotschka 是的,我已手动检查是否与 rigal 共享文件,并且已成功共享当我使用 API 登录后,共享文件未使用 API 显示。
  • 所以文件已成功共享,但当 Rigal 尝试使用 API 以编程方式访问它时没有显示?您能否提供 Rigal 用于访问该文件的代码?
  • 你好,@ziganotschka 我关注developers.google.com/drive/api/v3/quickstart/js 链接以从谷歌驱动器获取文件。我改变了 var SCOPES = "googleapis.com/auth/drive.file";在上面的代码示例中。
  • 用户能否访问不同范围的文件,例如: https://www.googleapis.com/auth/drive?文档 developers.google.com/identity/protocols/googlescopes 指定 https://www.googleapis.com/auth/drive.file 仅允许您“查看和管理您使用此应用打开或创建的 Google Drive 文件和文件夹”

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


【解决方案1】:

可以通过实现搜索查询q来过滤列表文件的搜索结果

  • 如果 Rigal 指定 q 'sharedWithMe' - 仅列出已由其他人与 Rigal 共享的文件。
  • 如果 Rigal 额外指定了 'test@example.org' in owners,这将允许从结果中消除其他人与 Rigal 共享的文件。
  • 无法区分通过 Manoj 的应用程序与 Rigal 共享的文件,而不是由 Manoj 手动共享的文件,除非 Monoj 的应用程序使用 service account,最终使用 impersonation,与 Rigal 共享文件.

基于您使用的 Drive v3 API 快速入门的示例:

function listFiles() {
        gapi.client.drive.files.list({
          'q': "sharedWithMe and 'test@example.org' in owners"
          'pageSize': 10,
          'fields': "nextPageToken, files(id, name)"
        }).then(function(response) {
          appendPre('Files:');
          var files = response.result.files;
          if (files && files.length > 0) {
            for (var i = 0; i < files.length; i++) {
              var file = files[i];
              appendPre(file.name + ' (' + file.id + ')');
            }
          } else {
            appendPre('No files found.');
          }
        });
      }

【讨论】:

  • 感谢您的帮助。能否提供代码示例?
  • 我根据您使用的快速入门提供了一个示例。
  • 你好@ziganotschka 我已经按照下面的教程使用谷歌驱动器API在谷歌驱动器上上传/访问/共享文件。 bytutorial.com/tutorials/google-api/… 请您建议如何使用服务帐户对应用程序进行身份验证?谢谢
  • 这更棘手 - 你需要首先创建一个服务帐户 - 如下所述:cloud.google.com/iam/docs/service-accounts 和这里:cloud.google.com/iam/docs/service-accounts 如何在 JS 中实现它的教程:dev.to/mornir/…基本上,你需要实现函数getCredentials()getDrive(),然后通过getDrive().permissions.create替换`gapi.client.drive.permissions.create`
  • 您好,@ziganotschka 我已经创建了一个服务帐户并按照步骤操作。我已经检查了以下教程,但它基于 Node Js。我们需要一个直接在浏览器中执行的javascript代码。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-06-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-21
  • 1970-01-01
  • 2021-04-05
相关资源
最近更新 更多