使用服务帐户密钥列出来自Google云端硬盘的公开共享文件,但不会获取公开文件

时间:2018-06-01 07:36:47

标签: node.js google-api google-drive-api google-apis-explorer google-javascript-api

我在使用服务帐户密钥和使用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权限。
  • 我希望列出所有公开共享文件。
  • 我在代码中错了。

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

2 个答案:

答案 0 :(得分:0)

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

如果您拥有文件ID,则可以将文件设置为public,您可以使用API​​密钥查看该文件。你无法编辑它,但你可以在它上面做一个文件。

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

答案 1 :(得分:0)

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

div {
  opacity: 0;
  transform: translateY(20vh);
  visibility: hidden;
  transition: opacity 0.6s ease-out, transform 1.2s ease-out;
  will-change: opacity, visibility;
}

div.inview {
  opacity: 1;
  transform: none;
  visibility: visible;
}

section {
  width: 100%;
  height: 100%;
  overflow: auto;
  background: black;
  color: yellow;
}

html,
body {
  height: 100%;
  padding: 0;
  margin: 0;
}