You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 21:55:49