下载某个帐户拥有并与我的服务帐户共享的 Google 云端硬盘文件

时间:2021-04-08 15:52:06

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

有一个由 Google 云端硬盘托管的共享电子表格文件的网址。

看起来和这个很像

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

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

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

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

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

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

我有这样的应用环境变量

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

1 个答案:

答案 0 :(得分:1)

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

<块引用>

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

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

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

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

您说得对,这不是通过下载 url 来完成的,而是通过使用您要下载的文件的 file.id 来完成的。

因为您将成为 downloading 一个 Google 表格,所以您想要执行 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);
相关问题