【问题标题】:Problems authenticating Service Account for google reseller api using the nodejs library使用 nodejs 库为谷歌经销商 api 验证服务帐户时出现问题
【发布时间】:2020-11-02 17:05:15
【问题描述】:

我正在尝试使用 nodejs 库访问谷歌经销商 api,该库具有非常糟糕的...,我的意思是参差不齐的文档。我尝试按照示例 here 进行操作,但在第 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,我发现了这个thread,这表明我的问题与冒充有关。因此,我将subject 属性中的电子邮件与我的帐户电子邮件交换了,该电子邮件具有指定的所有者权限。我还授予了服务帐户所有者权限,因为那时我很无知。不幸的是,这仅将错误消息更改为:

status: 401,
statusText: 'Unauthorized'

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

【问题讨论】:

  • 您是否在管理控制台->安全> API 控制中为服务帐户提供了必要的范围,解释为 here?您是否为您创建的服务帐户启用了域范围的委派?您的代码中的范围是否足以满足您尝试实现的请求?看看你的代码会很有帮助!
  • 我在变量OAUTH2_SCOPES 中发布了范围。我已经添加了域范围。我的代码现在没有更多内容了。我只尝试通过google.reseller({ version: "v1", auth: authJWT });调用api。
  • 如果您想使用模拟用户的服务帐户,您必须启用域范围的委派。至于范围,除了将它们粘贴到代码中之外,请确保在管理控制台中对其进行授权。为什么要使用服务帐号?
  • 我没有激活域范围的委派,因为我不希望每个创建的用户都必须经过手动授权。
  • 我检查了,范围在管理控制台中。我想使用服务帐户,因为我们想使用我们的后端转售 gsuite,因此请求将是服务器到服务器。我认为这是确切的用例。

标签: javascript node.js google-admin-sdk google-reseller-api


【解决方案1】:

为什么需要全域委派?

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

参考资料:

【讨论】:

  • 这看起来很适合生产。但是有没有办法在开发环境中做到这一点?因为现在,脚本在我的机器上本地运行,而不是在授权域下运行的服务器上。
  • 我不明白为什么您不能在开发环境中测试代码,只要您下载了 JSON_PRIVATE_KEY_FILE 的副本并将其存储在您在代码中指定的路径中。
  • 好吧,我尝试了授权域和域范围的委派,但仍然收到 401 错误。我检查了密钥文件,id 是正确的。输入的电子邮件也具有所有者权限。
  • 抱歉再次询问,您是否提供了必要的范围here?并且还在云控制台中启用API?谷歌谈到401 error:如果您看到此服务帐户,请检查您是否已成功完成服务帐户页面中的所有步骤。请确保所有those 步骤正确。
  • 似乎创建新帐户并将我的用户添加到其中就可以了。再次感谢你的帮助。你太棒了:-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-09-30
  • 1970-01-01
  • 1970-01-01
  • 2013-12-18
  • 2017-12-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多