从DirectoryService

时间:2015-04-29 19:39:26

标签: google-api-dotnet-client

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

每当我调用service.Users.List()或DirectoryService api中的任何其他方法时,我都会收到此错误。

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();
    }
}

4 个答案:

答案 0 :(得分:4)

2个选项:

  1. 您没有包含正确的范围。你确定DirectoryService.Scope.AdminDirectoryOrgunit,DirectoryService.Scope.AdminDirectoryUser就够了吗?
  2. 您是否在控制台中启用了API?有关详细信息,请访问:https://developers.google.com/api-client-library/dotnet/get_started#auth,在https://console.cloud.google.com/project中查找您的项目,并确保已启用目录管理API。
  3. 如果其中一个选项有效或者您仍然缺少其他选项,请更新此主题。

答案 1 :(得分:1)

范围

您似乎正在尝试此Quickstart

但是,该tuturoial中使用的范围是:

new [] { DirectoryService.Scope.AdminDirectoryUserReadonly };

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

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

令牌

更改范围(如上所示)后,可能必须删除OAuth2令牌,然后重新授权对应用程序的访问。 (除非您尚未完成“授权访问”步骤。)

enter image description here

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

启用API

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

Enable Directory API

enter image description here

Enable Gmail API

enter image description here

答案 2 :(得分:0)

这是我的工作凭证代码:

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,

答案 3 :(得分:0)

URL https://developers.google.com/gmail/api/quickstart/dotnet上的文档的范围设置为 静态字符串[]范围= {GmailService.Scope.GmailReadonly};将其设置为GmailService.Scope.MailGoogleCom,然后继续执行文档中指定的流程。这真是令人讨厌,我正在我的令牌响应文件中编辑范围