我正在使用 Google Directory API .NET 客户端获取域中的角色列表 (https://developers.google.com/admin-sdk/directory/reference/rest/v1/roles/list)。
我使用服务帐户代表用户进行身份验证以创建目录服务。 这是我的代码:
var initializer = new BaseClientService.Initializer
{
ApplicationName = "GoogleConnector",
HttpClientInitializer = new ServiceAccountCredential(
new ServiceAccountCredential.Initializer(connectionDetails.ClientEmail) { User = connectionDetails.UserId, Scopes = scopes }.FromPrivateKey(connectionDetails.PrivateKey)
)
};
var service = new DirectoryService(initializer);
var roles = await service.Roles.List("my_customer").ExecuteAsync();
现在,当用于模拟的用户分配有超级管理员角色时,它可以正常工作,没有任何问题。但是,向该用户提供超级管理员角色是不可行的。 当我删除超级管理员角色时,分配以下角色:
此外,还添加了下一个请求范围:
API 开始失败并出现以下错误:
Not Authorized to access this resource/
api [403] Errors [ Message[Not Authorized to access this resource/api] Location[ - ] Reason[forbidden] Domain[global] ]
编辑(在关于缺少对域用户的委派的评论之后)
我已向客户端应用程序提供域范围委托(因为我使用服务帐户,遵循指南)以及所有必需的范围:
此外,所有其他 API 都工作正常。我正在使用 groups.list 和 users.list 方法,没有任何问题。它们照常返回结果。
问题仅在于 roles.list 方法。
如有任何帮助,我们将不胜感激。
您需要传递完整的credentials.json以及具有访问权限的管理员用户。
公共静态 DirectoryService GetService() { var 凭证 = GetCredentials();
var workspaceAdmin = "[email protected]";
var scopes = new[] { "https://www.googleapis.com/auth/admin.directory.rolemanagement" };
var credential = GoogleCredential.FromFile(credentials).CreateScoped(scopes).CreateWithUser(workspaceAdmin);
return new DirectoryService(new BaseClientService.Initializer()
{
HttpClientInitializer = credential
});
}