提问者:小点点

使用nodejs库对google reseller api的服务帐户进行身份验证时出现问题


我正在尝试使用nodejs库访问google reseller api,它有非常shi.。。我指的是零零碎碎的文档。 我尝试按照这里的示例进行操作,但在第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",
    });

使用基本的谷歌fu,我发现了这个线程,这表明我的问题与冒充有关。 因此,我在subject属性中与我的帐户email交换了电子邮件,该帐户具有指定的所有者权限。 我也给了服务帐户所有者的权利,因为在这一点上我是相当无知的。 不幸的是,这只将错误消息更改为:

status: 401,
statusText: 'Unauthorized'

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


共1个答案

匿名用户

  • 当您使用服务帐户并启用全域委派时,这意味着您允许服务帐户对用户进行激励并代表他执行操作
  • 如果您使用没有模拟的服务帐户-服务帐户只能执行其授权的操作(例如,它可以访问驱动器上的文件或访问日历),但只有当您与服务帐户显式共享这些文件时才可以!
  • 要执行服务帐户未被授权的请求,您需要使服务帐户模拟具有必要授权的域用户-即您需要模拟该用户
  • 但是,要模拟用户,您需要显式地授予服务帐户代表用户执行操作的权限-这称为域范围委派
  • 启用全域委派不会使“每个创建的用户都必须通过手动授权”或影响任何其他与服务帐户无关的行为
  • 全域委派所做的唯一事情是允许服务帐户代表用户
  • 如果不启用全域委派,则不会授权用户的模拟,设置主题将引发错误

参考资料:

  • https://support.google.com/a/answer/162106?hl=en
  • https://developers.google.com/identity/protocols/oauth2/service-account#delegatingauthority
  • https://developers.google.com/admin-sdk/directory/v1/guides/delegation