我正试图使用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",
});
使用基本的谷歌傅,我发现了这个线程,这表明我的问题与模拟有关。因此,我在subject
属性中用我的帐户电子邮件交换了电子邮件,该帐户具有指定的所有者权限。我还赋予了服务帐户所有者的权利,因为在这一点上我非常无知。不幸的是,这只会将错误消息更改为:
status: 401,
statusText: 'Unauthorized'
有人知道出了什么问题吗?401表明缺少凭据。除了服务帐户的凭据外,我是否还必须指定我的私人电子邮件凭据?如果是,那么在哪里?我在google.auth.JWT.options
对象上找不到任何听起来很有希望的属性。
为什么需要域范围的委派
- 当您使用服务帐户并启用域范围委派时,这意味着您允许服务帐户模仿用户并代表他行事
- 如果您使用的服务帐户没有模拟-服务帐户只能执行经过身份验证的操作-例如,它可以访问驱动器上的文件或访问日历-但前提是您明确与服务帐户共享这些文件
- 要执行服务帐户未经授权的请求,您需要使服务帐户模拟具有必要授权的域用户,也就是说,您需要模拟用户
- 然而,要模拟用户,您需要明确地授予服务帐户代表用户操作的权限,这称为域范围委派
- 启用域范围的委派不会使";每个创建的用户都必须经过手动授权";或影响任何其他非服务帐户相关行为
domain-wide delegation
所做的唯一一件事就是允许服务帐户代表用户- 如果不启用域范围的委派,则不会授权用户的代理,并且设置
subject
将导致错误
参考文献:
- 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