Я пытаюсь перенести наш код на использование API-интерфейса Google Provisioning API API-интерфейса администратора, через клиентские библиотеки .NET, предоставленные Google ,API-интерфейс API администратора Google Admin - Получение групп из разных доменов
В старом Provisioning API (через клиентскую библиотеку .NET) вызова, чтобы получить группы для домена был очень прост:
Google.GData.Apps.AppsService apps = new Google.GData.Apps.AppsService(AppDomain, DomainAdminEmail, AdminPassword);
Google.GData.Apps.Groups.GroupsService service = apps.Groups;
AppsExtendedFeed appsFeed = service.RetrieveAllGroups();
Не совсем ракетостроение, и только учетные данные, необходимые были домен , адрес электронной почты администратора домена и пароль администратора. Пока вы можете предоставить эти три параметра, вы можете получить группы для любого домена.
Я пытался в течение двух дней создать эквивалентный вызов, используя новый API каталогов Admin SDK (через новую клиентскую библиотеку .NET), и мне очень тяжело. Единственный способ, которым я смог заставить его работать, - создать учетную запись службы для проекта, связанного с электронной почтой администратора домена, включая создание файла закрытого ключа, на основе полезного post от mwpreston):
//Create security certificate using private key file and password.
var certificate = new X509Certificate2(pathToPrivateKeyFile, privateKeyPassword, X509KeyStorageFlags.Exportable);
//Create a service credential using the certificate, admin email and API scopes.
ServiceAccountCredential credential = new ServiceAccountCredential(
new ServiceAccountCredential.Initializer(serviceAccountEmail)
{
User = adminUserEmail,
Scopes = scopes
}.FromCertificate(certificate));
//Create Directory Service using the service credential and the application name.
var dirservice = new DirectoryService(new BaseClientService.Initializer()
{
HttpClientInitializer = credential,
ApplicationName = applicationName
});
var groupsListRequest = dirservice.Groups.List();
groupsListRequest.Domain = domain;
domainGroups = groupsListRequest.Execute();
Однако, поскольку учетная запись службы связана с определенным доменом (как указано в учетной записи электронной почты администратора учетной записи службы), ее можно использовать только для запроса групп из этого конкретного домена.
У нас есть клиенты с тысячами разных доменов. Нецелесообразно создавать новую учетную запись службы для каждого домена клиента (а также файл закрытого ключа).
Я искал и искал способ вызвать DirectoryService таким образом, чтобы использовать те же параметры (домен, адрес электронной почты администратора и пароль), но я ничего не могу найти. Документация для клиентской библиотеки Admin API .NET чрезвычайно редкая и не нужна.
API-интерфейс Provisioning API будет устаревшим 20 апреля 2015 года, поэтому кто-то еще должен был столкнуться с этой проблемой. Может ли кто-нибудь помочь?
К сожалению, это не решит мою проблему. Мне нужно иметь возможность запрашивать группы (и членов групп) из многих доменов _different_. Исходный API позволил мне сделать вызов с использованием домена, электронной почты администратора и пароля; новый API, похоже, настаивает на том, что я использую определенную учетную запись службы для каждого домена. Это непрактично, потому что у наших клиентов есть тысячи доменов. –
Возможно, я просто не понимаю вашу проблему, но в моих приложениях я также получаю доступ к информации о каталогах для разных доменов с одной учетной записью службы, создавая только объект учетных данных (который все тот же, за исключением serviceAccountUser - target domain admin), который затем передается каталог апи конструктор/строитель, как вы можете видеть в следующем коде ... – user3686724
GoogleCredential.Builder КУП = новый GoogleCredential.Builder() \t \t \t .setTransport (т) \t \t \t.setJsonFactory (jsonFactory) \t \t \t .setServiceAccountScopes (прицелы) \t \t \t .setServiceAccountPrivateKey (serviceAccountPrivateKey) \t \t \t .setServiceAccountId (Config.SERVICE_ACCOUNT_ID) .setServiceAccountUser (serviceAccountUser); Каталог dir = new Directory.Builder (gc.getTransport(), gc.getJsonFactory(), null) .setHttpRequestInitializer (gc) .build(); – user3686724