使用服务帐户密钥列出来自 google 驱动器的 publicly 共享文件未获取 public 文件

List publicly shared files from google drive using service account key not getting public files

我在使用服务帐户密钥和 drive.files.list API 编码时遇到问题,但我无法获取文件,尽管我已公开共享所有文件

const { google } = require('googleapis');
const drive = google.drive('v3');
const jwtClient = new google.auth.JWT(
    client_email,
    null,
    private_key,
    ['https://www.googleapis.com/auth/drive']
);

jwtClient.authorize(function (err, tokens) {
    if (err) {
        console.log(err);
        return;
    } else {
        console.log("Successfully connected!");
    }
});


// List Drive files.
drive.files.list({
    auth: jwtClient,
    // fields: "files",
    includeRemoved: false,
    spaces: 'drive'
}, (listErr, resp) => {
    if (listErr) {
        console.log(listErr);
        return;
    }
    console.log("Result ========>", resp.data.files)
});

请帮我解决这个问题。 谢谢:)

服务帐户不是您,而是虚拟用户。与任何用户一样,files.list 只会 return 它有权访问的文件。那是它创建的文件和某人与之共享的文件。虽然有人会认为每个人都可以访问 public 个文件。如果 files.list return 编辑了 Google 驱动器上所有设置为 public 的文件的列表,那将是一个巨大的列表并且不是很有用。

通过将文件设置为 public 如果您有文件 ID,您将能够使用 API 键查看它。您将无法对其进行编辑,但可以对其进行 file.get。

获取服务帐户电子邮件地址并转到 google 驱动器共享包含服务帐户文件的文件夹,就像您与任何其他用户一样。如果愿意,您还可以与服务帐户单独共享每个文件。 然后尝试做一个 files.list.

使用服务帐户电子邮件共享域范围的共享文件夹对我不起作用。
但是,我确实找到了这篇文章 (https://nilsnh.no/2018/12/17/how-to-implement-domain-wide-delegation-in-gsuite-using-node.js) 这解释了您可以将“要模拟的电子邮件地址”传递给 google.auth.JWT 调用的主题参数。现在就像您以该用户身份登录一样。为此,您可能应该创建一个特定的域用户。此专用用户不会有任何个人驱动器文件,但它允许您访问域范围内的共享驱动器而无需使用该用户的密码。

const emailAddressToImpersonate = 'sharedDriveAccess@myworkspacedomain.com'
const jwtClient = new google.auth.JWT(
    client_email,
    null,
    private_key,
    ['https://www.googleapis.com/auth/drive'],
    emailAddressToImpersonate
);