【问题标题】:Node.js - Can't access my account from the Google Drive APINode.js - 无法从 Google Drive API 访问我的帐户
【发布时间】:2019-12-24 17:41:59
【问题描述】:

我需要以编程方式修改我的 Google 云端硬盘,以创建文件夹并将一堆文件上传到其中,然后在需要时删除该根文件夹并重做整个过程。

我创建了一个具有服务帐户的项目,然后下载了 JSON 并将其存储在我的计算机上。
接下来,我关注了this tutorial

我最终得到了这段代码:

const auth = await google.auth.getClient({
  credentials: require(pathToServiceAccountJSON),
  scopes: "https://www.googleapis.com/auth/drive"
});

const drive = await google.drive({ version: "v3", auth });

drive.files
  .create({
    resource: {
      name: filename,
      mimeType: "application/vnd.google-apps.folder",
      parents: [parentId]
    }
  })
  .then(result => console.log("SUCCESS:", result))
  .catch(console.error);

但是,执行它会导致抛出以下错误:

{
  ...
  errors: [{
    domain: "global",
    reason: "forbidden",
    message: "Forbidden"
  }]
}

【问题讨论】:

  • 你能提供你的整个脚本来复制你的错误吗?当然,请删除您的个人信息。

标签: node.js authentication error-handling google-drive-api service-accounts


【解决方案1】:

首先,如果你迷路了,这个quick start from Google 可能比教程更好。

其次,要访问您的驱动器,您必须在应用中请求适当的范围,并且您必须通过访问将在授权过程中提供的 URL 来授权应用请求的权限(范围)。 Here is a guide to scopes.

【讨论】:

  • 我可以为此使用服务帐户吗?还是我必须使用 OAuth 访问我的数据?
  • 很确定答案是两者都有,但我不确定您所说的“服务帐户”是什么意思。您授予应用程序的权限植根于您的帐户(这样,任何想要运行该应用程序并将其附加到他们的驱动器的人都必须自己授予它权限。)
  • 好吧,当我尝试执行const {data: { files }} = await drive.files.list(); - 代码确实成功执行。但是,files 仅包含对 Getting started.pdf 文件的引用
【解决方案2】:

要能够使用服务帐户模拟用户(如您自己或域中的任何其他人),您需要启用域范围委派,为此您需要拥有 G Suite 帐户 [1] .如果是这种情况,从库示例 [2] 中,您需要在构造 JWT 对象时将要模拟的用户添加为第 5 个参数:

const {JWT} = require('google-auth-library');
const keys = require('./jwt.keys.json');

async function main() {
  const client = new JWT(
    keys.client_email,
    null,
    keys.private_key,
    ['https://www.googleapis.com/auth/cloud-platform'],
    'userToImpersonate@example.com'
  );
  const url = `https://dns.googleapis.com/dns/v1/projects/${keys.project_id}`;
  const res = await client.request({url});
  console.log(res.data);
}

如果您没有 G Suite 帐户,您只需按照快速入门 [3] 步骤获取驱动器服务,然后使用它提出创建请求。

[1]Do I need G Suite account to make requests impersonating an user with a service account?

[2]https://github.com/googleapis/google-auth-library-nodejs#json-web-tokens

[3]https://developers.google.com/drive/api/v3/quickstart/nodejs

【讨论】:

  • 我没有 G Suite 帐户。相反,我可以在我的帐户中使用 OAuth 2.0,这样我就可以进行身份​​验证。除了,出于某种原因,我的代码仍然不允许我这样做。
  • 您是否按照快速入门进行操作?你有错误吗?您必须生成 credenditals.json,但不能从服务帐户生成。
  • 我跟着它神奇地工作了。现在,我需要以某种方式提取与我相关的代码
  • 从示例中只有 listFiles 函数不相关,您可以将其替换为您在问题中已经拥有的一段代码,从您声明 const drive 到最后。这就是我所说的使用驱动器服务(驱动器常量)的意思,您可以发出任何驱动器 API 请求(在这种情况下创建请求)。
  • 我希望你能弄清楚。如果对您有帮助,请考虑接受answer
猜你喜欢
  • 2015-04-19
  • 1970-01-01
  • 2015-06-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多