【问题标题】:Download Google Drive file owned by some account and shared with my service account下载某个帐户拥有并与我的服务帐户共享的 Google Drive 文件
【发布时间】:2021-07-04 12:50:56
【问题描述】:

有一个由 Google Drive 托管的共享电子表格文件的 URL。

和这个很像

https://docs.google.com/spreadsheets/d/1TFFswncS12FAc-Fsh33dMfL0UK87LCcZZNToV0/edit?usp=sharing

我想通过 nodejs 应用程序使用一些 Google 服务帐户和 Google Drive API 客户端库下载此文件。但据我所知,该库没有通过 URL 下载文件的方法或选项。

https://developers.google.com/drive/api/v3/manage-downloads

取而代之的是一个需要fileId 属性的get 方法,在我看来,通过fileId 访问某人的文件是不可能的。

因此,很可能,我必须根据服务帐户 client_idprivate_key 生成一个身份验证令牌,然后下载(实际上是导出的 CSV),任何 HTTP 客户端都将令牌作为标头传递。

这是一个正确的选择吗?如何在没有密码的情况下对应用进行身份验证?

我有这样的应用程序环境变量

GOOGLE_FEED_ACCOUNT_TYPE=service_account
GOOGLE_FEED_PROJECT_ID=my-app
GOOGLE_FEED_PRIVATE_KEY_ID=sdf796a7S58FSADF9A8S97FD987AS6D8F75A8Sas
GOOGLE_FEED_PRIVATE_KEY="-----BEGIN PRIVATE KEY-----\n\n-----END PRIVATE KEY-----\n"
GOOGLE_FEED_CLIENT_EMAIL=my-app@example.com
GOOGLE_FEED_CLIENT_ID=398387234329388162487
GOOGLE_FEED_FOLDER_ID=1QFBASSDFasdfasew3wsD85cHpf-9U

【问题讨论】:

  • 谁曾对此投过票,请发表评论,让我们知道这可能是基于意见的。

标签: node.js google-api google-drive-api service-accounts google-api-nodejs-client


【解决方案1】:

您需要了解的是,如果其他人可以访问您的文件,那么您的私人数据就会受到影响。您需要获得苍蝇所有者的许可才能访问它。使用服务帐户,您可以对其进行预授权并授予其访问文件的权限。如果该人与服务帐户电子邮件地址共享文件,就像您与任何其他用户共享文件一样,那么服务帐户将有权下载文件。

这是一个正确的选择吗?如何在没有密码的情况下对应用进行身份验证?

您可以访问私人用户数据的唯一方法是用户授予您访问权限。您可以使用 Oauth2 并要求用户运行您的应用程序并授予您访问权限,或者您可以使用服务帐户并预授权它访问数据。

如果没有他们以某种方式授予您访问权限,就真的无法访问私人用户数据。客户端登录使用登录名和密码,并在 2015 年被谷歌关闭,因此多年来一直没有工作。

使用服务帐户导出工作表。

你是对的,这不是通过下载 URL 来完成的,而是通过使用你要下载的文件的 file.id 来完成的。

您将成为downloading 谷歌表格,您将需要执行 file.export 来下载该文件。文件导出会将您的工作表转换为 csv 文件,以便您可以在机器上阅读。

只需确保您与服务帐户共享它即可。

const {google} = require('googleapis');

const auth = new google.auth.GoogleAuth({
  keyFile: '/path/to/your-secret-key.json',
  scopes: ['https://www.googleapis.com/auth/cloud-platform'],
});

var fileId = '1ZdR3L3qP4Bkq8noWLJHSr_iBau0DNT4Kli4SxNc2YEo';
var dest = fs.createWriteStream('/tmp/resume.pdf');
    drive.files.export({
      fileId: fileId,
      mimeType: 'application/pdf'
    })
        .on('end', function () {
          console.log('Done');
        })
        .on('error', function (err) {
          console.log('Error during download', err);
        })
        .pipe(dest);

【讨论】:

  • @DalmTo,您好,感谢您的回答!您能否向我澄清一下 fileId 是否是 URL 中的关键部分?否则,我在哪里可以找到它?
  • 可能是,但我不会打赌。从服务帐户执行 file.list ,如果文件具有访问权限,您应该会看到该文件。这是查找文件 ID 的最简单方法。
猜你喜欢
  • 2019-12-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-27
  • 1970-01-01
  • 2013-08-24
  • 2023-03-11
相关资源
最近更新 更多