2

我在编码时遇到问题,在使用服务帐户密钥和使用 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)
});
  • 结果,尽管我已公开共享所有文件并授予所有人编辑权限,但我什么也没得到。
  • 在服务帐户中,我启用了 google API 并授予了 qwner 权限。
  • 我希望列出所有公开共享文件。
  • 我在代码中出错的地方。

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

4

2 回答 2

3

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

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

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

于 2018-06-01T08:36:30.077 回答
0

与服务帐户电子邮件共享域范围的共享文件夹对我不起作用。
但是,我确实找到了这篇文章(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
);
于 2021-01-12T17:32:57.337 回答