Google api 另一个401当使用带有admin SDK的服务帐户模拟超级管理员时

Google api 另一个401当使用带有admin SDK的服务帐户模拟超级管理员时,google-api,google-admin-sdk,Google Api,Google Admin Sdk,我正在尝试使用带有域范围委派的服务帐户和REST API访问Admin SDK目录API。我可以在不模拟用户的情况下成功获得承载令牌,但当我尝试使用“sub”密钥模拟用户时,我收到401“unauthorized_client”错误。从我在网上读到的所有内容(包括许多SO答案和其他地方),这表明我没有在我的GSuite管理控制台中批准该应用程序,但事实并非如此 以下是我迄今为止采取的步骤 1) 启用管理SDK 2) 在IAM和管理区域中,使用DwD创建服务帐户。 3) 在API&Servic

我正在尝试使用带有域范围委派的服务帐户和REST API访问Admin SDK目录API。我可以在不模拟用户的情况下成功获得承载令牌,但当我尝试使用“sub”密钥模拟用户时,我收到401“unauthorized_client”错误。从我在网上读到的所有内容(包括许多SO答案和其他地方),这表明我没有在我的GSuite管理控制台中批准该应用程序,但事实并非如此

以下是我迄今为止采取的步骤

1) 启用管理SDK

2) 在IAM和管理区域中,使用DwD创建服务帐户。

3) 在API&Services区域中,选择credentials并为我刚刚创建的服务帐户创建服务帐户密钥。

4) 下载私钥文件

{
  "type": "service_account",
  "project_id": "gsuite-REDACTED",
  "private_key_id": "------3d2e",
  "private_key": "REDACTED",
  "client_email": "REDACTED-320@gsuite-REDACTED.iam.gserviceaccount.com",
  "client_id": "-----0381",
  "auth_uri": "https://accounts.google.com/o/oauth2/auth",
  "token_uri": "https://accounts.google.com/o/oauth2/token",
  "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs",
  "client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/REDACTED-320%40gsuite-REDACTED.iam.gserviceaccount.com"
}
5) 在admin.google.com中启用API访问

6) 在“管理API客户端访问”中,为(3)中创建的客户端添加服务帐户ID和以下作用域

7) 确保我计划模拟的用户是“超级管理员”


当我试图生成承载令牌时,我收到一个401错误

{
 "error": "unauthorized_client",
 "error_description": "Client is unauthorized to retrieve access tokens using this method."
}
我尝试过使用各种库,但总是得到相同的结果,所以我猜这与我的应用程序配置有关,而不是与我的代码实现有关。非常感谢您的帮助。例如,这里我使用的是Ruby:

require 'googleauth'

scopes = ['https://www.googleapis.com/auth/admin.directory.user',
                'https://www.googleapis.com/auth/admin.directory.group']

authorizer = Google::Auth::ServiceAccountCredentials.make_creds(
  json_key_io: File.open("gsuite.json"),
  scope: scopes).dup

authorizer.sub = 'joe@-----.io'
puts authorizer.fetch_access_token!

步骤6之后,您等待了多长时间?在进入管理控制台后获得访问权限有时可能需要几个小时。

我发现了问题所在-是配置问题,而不是代码问题。在步骤6中,当我自动调整API客户机时,我输入了“服务帐户ID”,在我的例子中是:“编辑”-320@gsuite-编辑.iam.gserviceaccount.com”。虽然这似乎是可行的-正确的数字ID出现(如屏幕截图所示)-我得到了401个错误

但是,当我从私钥文件中输入“client_id”(在我的例子中是一个以0381结尾的数字)并使用相同的作用域时,我可以成功地进行身份验证


令人沮丧的是,输入服务帐户id没有引发错误,但结果很好。

我已经这样做了,但仍然会遇到相同的“未经授权的客户端”错误。事实上,我已经尝试了来自网络的各种可能的建议组合,但最终还是得到了这条信息。这是令人难以置信的沮丧-实际上-刮擦,现在它的工作。我(再次)删除了只读作用域。这可能就像Jay Lee说的。很高兴你能成功。我同意这比它本应具有的挑战性要大得多。事实上,大约有十几份官方文件涵盖了这一过程,这并没有帮助。