使用 nodejs 库验证 google 经销商 api 的服务帐户时出现问题
Problems authenticating Service Account for google reseller api using the nodejs library
我正在尝试使用 nodejs library, which has very shi..., I mean spotty documentation. I tried following the example here 访问 google 经销商 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
对象上找到任何听起来很有希望的 属性。
为什么需要全域授权?
- 当您使用服务帐户并启用全域委派时,这意味着您允许服务帐户模拟用户并代表他行事
- 如果您使用没有模拟的服务帐户 - 服务帐户只能执行它被授权的操作 - 例如它可以访问您云端硬盘上的文件或访问您的日历 - 但前提是您明确与服务帐户共享这些文件!
- 要执行服务帐户未获得授权的请求,您需要让服务帐户模拟具有必要授权的域用户 - 即您需要模拟用户
- 但是,要模拟用户,您需要明确授予服务帐户代表用户执行操作的权限 - 这称为全域委托
- 启用全域授权不会使“每个创建的用户都必须经过手动授权”或影响任何其他非服务帐户相关行为
domain-wide delegation
唯一做的就是允许一个服务帐户代表一个用户
- 如果不启用域范围的委派,用户的模拟将不会被授权,设置
subject
将引发错误
参考文献:
我正在尝试使用 nodejs library, which has very shi..., I mean spotty documentation. I tried following the example here 访问 google 经销商 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
对象上找到任何听起来很有希望的 属性。
为什么需要全域授权?
- 当您使用服务帐户并启用全域委派时,这意味着您允许服务帐户模拟用户并代表他行事
- 如果您使用没有模拟的服务帐户 - 服务帐户只能执行它被授权的操作 - 例如它可以访问您云端硬盘上的文件或访问您的日历 - 但前提是您明确与服务帐户共享这些文件!
- 要执行服务帐户未获得授权的请求,您需要让服务帐户模拟具有必要授权的域用户 - 即您需要模拟用户
- 但是,要模拟用户,您需要明确授予服务帐户代表用户执行操作的权限 - 这称为全域委托
- 启用全域授权不会使“每个创建的用户都必须经过手动授权”或影响任何其他非服务帐户相关行为
domain-wide delegation
唯一做的就是允许一个服务帐户代表一个用户- 如果不启用域范围的委派,用户的模拟将不会被授权,设置
subject
将引发错误
参考文献: