【问题标题】:Google Admin SDK Directory API - Getting Groups from varying DomainsGoogle Admin SDK Directory API - 从不同的域获取组
【发布时间】:2015-02-06 21:27:28
【问题描述】:

我正在尝试通过 Google 提供的 .NET 客户端库将使用(即将弃用的)Google Provisioning API 的代码迁移到 Admin SDK Directory API。

在旧的 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();

不完全是火箭科学,唯一需要的凭据是域、域的管理员电子邮件和管理员密码。只要您能提供这三个参数,您就可以获得任何域的组。

两天来,我一直在尝试使用新的 Admin SDK 目录 API(通过新的 .NET 客户端库)创建一个等效调用,这让我很难受。我能够让它工作的唯一方法是为与域的管理员电子邮件关联的项目创建一个服务帐户,包括生成一个私钥文件,基于 mwpreston 的有用post) :

//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 客户端库的文档非常少,没有任何帮助。

Provisioning API 将于 2015 年 4 月 20 日弃用,因此肯定有人遇到过这个问题。有人可以帮忙吗?

【问题讨论】:

    标签: asp.net google-directory-api google-provisioning-api


    【解决方案1】:

    您应该在构建凭证时使用“模拟”(通过 .setServiceAccountUser("user@example.com"))。查找示例here

    【讨论】:

    • 不幸的是,这不能解决我的问题。我需要能够从许多不同的域请求组(和组的成员)。原始 API 允许我使用域、管理员电子邮件和密码进行调用;新的 API 似乎坚持我为每个域使用一个特定的服务帐户。这是不切实际的,因为我们的客户拥有数千个域。
    • 也许我只是不明白您的问题,但在我的应用程序中,我还通过仅构造凭据对象(除了 serviceAccountUser - 目标域外,它仍然相同)使用一个服务帐户访问不同域的目录信息admin) 然后将其传递给目录 api constructor/builder ,如您在以下代码中所见...
    • GoogleCredential.Builder bgc = new GoogleCredential.Builder() .setTransport(t) .setJsonFactory(jsonFactory) .setServiceAccountScopes(scopes) .setServiceAccountPrivateKey(serviceAccountPrivateKey) .setServiceAccountId(Config.SERVICE_ACCOUNT_ID) .setServiceAccountUser(serviceAccountUser );目录 dir = new Directory.Builder(gc.getTransport(), gc.getJsonFactory(), null).setHttpRequestInitializer(gc).build();
    • 感谢您的反馈 - 看起来您正在使用 Java 客户端库,而我必须使用 .NET 客户端库。但是,您给了我一些非常有用的线索,让我了解如何尝试使用 .NET 进行复制。明天我将深入研究代码,看看我是否可以使用 .NET 来完成您在 Java 中所做的事情。我明天回来报告。
    • 嗨@user3686724 - 当用户的域与服务帐户管理员的域不匹配时,我找不到任何请求数据的方法。我发现可以在 Google 管理控制台上将多个域与一个帐户相关联(Google 管理控制台 -> 域 -> 添加域或域别名)。你的账户是这样设置的吗?也许这就是您能够通过您的服务帐户从多个域请求数据的原因?
    【解决方案2】:

    您可以在 Google Developer Console 上创建一个项目并生成一个刷新/访问令牌。这是链接 - https://developers.google.com/accounts/docs/OAuth2WebServer

    我没有使用客户端库,因此无法帮助您编写代码。您可以使用“列表”API,它将为您提供客户所有域的所有组(如果您提供 customerId)-https://developers.google.com/admin-sdk/directory/v1/reference/groups/list

    【讨论】:

      猜你喜欢
      • 2013-11-23
      • 1970-01-01
      • 2017-07-26
      • 1970-01-01
      • 2015-09-23
      • 1970-01-01
      • 2013-07-27
      • 2013-07-10
      • 1970-01-01
      相关资源
      最近更新 更多