从 DirectoryService 收到权限不足错误

Receiving Insufficient Permission error from DirectoryService

我正在尝试设置 c# 代码来管理我们的 Google 域。

每当我从 DirectoryService api.api.

调用 service.Users.List() 或任何其他方法时,我都会收到此错误
Google.Apis.Requests.RequestError

Insufficient Permission [403]

Errors [

    Message[Insufficient Permission] Location[ - ] Reason[insufficientPermissions] Domain[global]

]

我遵循了 OAuth 设置中的所有说明。我使用的帐户是域管理员。

我正在使用的客户端机密文件在与 GAM.exe 一起使用时可以正常工作以执行相同的操作。这让我相信我的代码做错了。

下面是我查询用户的代码,有什么遗漏吗?

        static void Main(string[] args)
    {
        var applicationName = "App Project Name";
        var userName = "admin@domain.com";
        var clientID = "clientIDfromAPIcredentialpageonconsole.developers.google.com";

        UserCredential credential;

        using (var stream = new FileStream("C:\gam\client_secrets.json", FileMode.Open, FileAccess.Read))
        {
            credential = GoogleWebAuthorizationBroker.AuthorizeAsync(
                GoogleClientSecrets.Load(stream).Secrets,
                new[] { DirectoryService.Scope.AdminDirectoryOrgunit, DirectoryService.Scope.AdminDirectoryUser },
                userName,
                CancellationToken.None, null).Result;
        }

        var service = new DirectoryService(new BaseClientService.Initializer() 
            { 
                ApplicationName = applicationName, 
                HttpClientInitializer = credential 
            });

        var list = service.Users.List();

        var users = list.Execute();
    }
}

2 个选项:

  1. 您没有包含正确的范围。你确定DirectoryService.Scope.AdminDirectoryOrgunit、DirectoryService.Scope.AdminDirectoryUser够了吗?
  2. 您是否在控制台中启用了 API?如需更多信息,请访问:https://developers.google.com/api-client-library/dotnet/get_started#auth, Look for your project in https://console.cloud.google.com/project 并确保您启用了目录管理 API。

如果这些选项之一有效或您仍然缺少其他选项,请更新此线程。

这是我的工作凭证代码:

using (var stream =
    new FileStream("client_secret.json", FileMode.Open, FileAccess.Read))
    {
        string credPath = System.Environment.GetFolderPath(
            System.Environment.SpecialFolder.Personal);
            credPath = Path.Combine(credPath, ".credentials/calendar-dotnet-quickstart.json");

            UserCredential credential = GoogleWebAuthorizationBroker.AuthorizeAsync(
                GoogleClientSecrets.Load(stream).Secrets,
                new string[] { CalendarService.Scope.Calendar },
                "username@gmail.com",
                CancellationToken.None,
                new FileDataStore(credPath, true)).Result;
            Console.WriteLine("Credential file saved to: " + credPath);
        }

确保在控制台中启用 API,

作用域

看来你正在尝试这个 Quickstart:

但是,该教程中使用的范围是:

new [] { DirectoryService.Scope.AdminDirectoryUserReadonly };

但是,在您发布的代码中,您有:

new[] { DirectoryService.Scope.AdminDirectoryOrgunit, DirectoryService.Scope.AdminDirectoryUser },

代币

更改范围后(如上所示),您可能必须删除 OAuth2 令牌,然后重新授权您的应用程序访问。 (除非您还没有完成 "authorize access" 步骤。)

\token.json\Google.Apis.Auth.OAuth2.Responses.TokenResponse-user

启用APIs

此外,正如我认为您已经发现的那样,启用目录 API 与启用 Gmail API 的过程不同(在不同的 URL 中找到)

Enable Directory API

Enable Gmail API

url https://developers.google.com/gmail/api/quickstart/dotnet 的文档将范围设置为 静态字符串[]范围={GmailService.Scope.GmailReadonly};将其设置为 GmailService.Scope.MailGoogleCom,然后按照 document.It 中指定的流程继续操作真是太可惜了,我正在编辑令牌响应文件中的范围