我尝试使用具有域范围委派和REST API的服务帐户访问Admin SDK Directory API。我可以在不冒充用户的情况下成功获得持有人令牌,但是我可以用一个" sub"来冒充用户。密钥,我收到401," unauthorized_client"错误。从我在线阅读的所有内容(包括众多SO答案和其他地方),这表明我还没有在我的GSuite管理控制台中批准该应用程序,但事实并非如此。
以下是我目前采取的步骤。
3)在Apis&服务区域,为刚刚创建的服务帐户选择凭据并创建服务帐户密钥。
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"
}
6)在"管理API客户端访问"为(3)中创建的客户端添加服务帐户ID和以下范围
当我尝试生成承载令牌时,我收到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!
答案 0 :(得分:1)
我想出了问题 - 这是配置而不是代码。在步骤6中,当我自动化API客户端时,我输入了“服务帐户ID”,在我的情况下:“REDACTED-320@gsuite-REDACTED.iam.gserviceaccount.com”。虽然这似乎有效 - 但是出现了正确的数字ID(如屏幕截图所示) - 我收到了401错误。
但是,当我从我的私钥文件输入“client_id”时,在我的情况下,一个以0381结尾的数字,并使用相同的范围,那么我可以成功进行身份验证。
输入服务帐户ID并没有引发错误令人沮丧。但是一切都很顺利。
答案 1 :(得分:0)
你在第6步之后等了多久?在进入管理控制台后进入访问权限有时可能需要几个小时。