1

我正在尝试使用nodejs库访问谷歌经销商 api,该库非常糟糕……,我的意思是参差不齐的文档。我尝试按照此处的示例进行操作,但在第 3 步失败并出现以下错误:

  code: 403,
  errors: [
    {
      domain: 'global',
      reason: 'insufficientPermissions',
      message: 'Authenticated user is not authorized to perform this action.'
    }
  ]

我的配置如下所示:

    const OAUTH2_SCOPES = [
      "https://www.googleapis.com/auth/admin.directory.user",
      "https://www.googleapis.com/auth/apps.order",
      "https://www.googleapis.com/auth/siteverification",
      "https://www.googleapis.com/auth/cloud-platform",
    ];

   const authJWT = new google.auth.JWT({
      keyFile: JSON_PRIVATE_KEY_FILE,
      scopes: OAUTH2_SCOPES,
      subject: RESELLER_ADMIN_USER,
      email: "gsuite-reseller@some-cool-name-because-why-not.iam.gserviceaccount.com",
    });

使用基本的 google fu,我找到了这个线程,这表明我的问题与模仿有关。所以我用我的帐户电子邮件交换了subject财产中的电子邮件,该电子邮件具有指定的所有者权利。我还授予了服务帐户所有者权限,因为那时我很无知。不幸的是,这仅将错误消息更改为:

status: 401,
statusText: 'Unauthorized'

有人知道出了什么问题吗?401表明缺少凭据。除了服务帐户之外,我是否还必须指定我的私人电子邮件凭据?如果是,那么在哪里?我没有在该google.auth.JWT.options物体上找到任何听起来很有希望的属性。

4

1 回答 1

2

为什么需要全域委派?

  • 当您使用服务帐户并启用域范围委派时,这意味着您允许服务帐户模拟用户并代表他行事
  • 如果您在没有模拟的情况下使用服务帐户 - 服务帐户只能执行其授权的操作 - 例如,它可以访问您的云端硬盘上的文件或访问您的日历 - 但前提是您明确与服务帐户共享这些文件!
  • 要执行服务帐户未授权的请求,您需要使服务帐户模拟具有必要授权的域用户 - 即您需要模拟用户
  • 但是,要模拟用户,您需要明确授予服务帐户代表用户执行操作的权限 - 这称为域范围委派
  • 启用域范围的委派不会使“每个创建的用户都必须经过手动授权”或影响任何其他与服务帐户无关的行为
  • 唯一要做的domain-wide delegation就是允许服务帐户代表用户
  • 如果不启用域范围的委派,用户的模拟将不会被授权,并且设置 asubject会引发错误

参考:

于 2020-07-13T14:59:03.263 回答