使用Google Directory API获取域内用户时遇未授权错误求助
Google Directory API 未授权错误排查方案
核心遗漏点及修复方法
必须指定模拟的域管理员账号
服务账号使用域级委派时,必须明确指定要模拟的域内管理员账号(该账号需拥有目录访问权限),否则无法获取用户数据。在ServiceAccountCredential.Initializer中添加User属性:ServiceAccountCredential credential = new ServiceAccountCredential(new ServiceAccountCredential.Initializer(serviceAccountEmail) { Scopes = new[] { DirectoryService.Scope.AdminDirectoryUserReadonly, DirectoryService.Scope.AdminDirectoryUser }, User = "admin@domain.org" // 替换为你的域管理员邮箱 }.FromCertificate(certificate));确认域级委派的权限范围完全匹配
登录Google Admin控制台,检查服务账号的域级委派设置,确保添加的权限范围与代码中使用的完全一致(注意大小写和完整路径,比如https://www.googleapis.com/auth/admin.directory.user.readonly),且未遗漏任何必要范围。验证模拟账号的权限
用来模拟的管理员账号必须分配了用户管理相关的管理员角色(如“用户管理管理员”),普通账号无权限访问Directory API的用户数据。调整证书加载参数
部分环境下,证书加载的权限设置可能导致问题,可修改X509Certificate2的初始化参数,添加额外的存储标志:var certificate = new X509Certificate2(path, "notasecret", X509KeyStorageFlags.Exportable | X509KeyStorageFlags.MachineKeySet | X509KeyStorageFlags.PersistKeySet);
修改后的完整示例代码
static void Main(string[] args) { string serviceAccountEmail = "google-directory-reader@projects-test.iam.gserviceaccount.com"; var path = @"D:\Anusha\directory-read.p12"; if (!File.Exists(path)) { return; } var certificate = new X509Certificate2(path, "notasecret", X509KeyStorageFlags.Exportable | X509KeyStorageFlags.MachineKeySet | X509KeyStorageFlags.PersistKeySet); ServiceAccountCredential credential = new ServiceAccountCredential(new ServiceAccountCredential.Initializer(serviceAccountEmail) { Scopes = new[] { DirectoryService.Scope.AdminDirectoryUserReadonly, DirectoryService.Scope.AdminDirectoryUser }, User = "admin@domain.org" // 替换为实际域管理员邮箱 }.FromCertificate(certificate)); var service = new DirectoryService(new BaseClientService.Initializer() { HttpClientInitializer = credential, ApplicationName = "Directory API Sample" }); UsersResource.GetRequest request = service.Users.Get("useremail@domain.org"); var user = request.Execute(); }
内容的提问来源于stack exchange,提问作者Anusha Swaminathan
相关产品推荐
相关产品推荐

