如何在不知道来自该域的电子邮件的情况下,使用服务帐户获取Google Apps域中用户的电子邮件?

时间:2014-11-04 12:31:23

标签: google-admin-sdk google-apps-marketplace

我尝试使用服务帐户访问已安装我的应用的域名(通过Google Apps Marketplace)。

但是,调用Google Admin SDK API,获取给定域的用户列表或管理员列表,似乎要求您知道域中用户的电子邮件地址。

https://developers.google.com/admin-sdk/directory/v1/guides/delegation#instantiate_an_admin_sdk_directory_service_object

  HttpTransport httpTransport = new NetHttpTransport();
  JacksonFactory jsonFactory = new JacksonFactory();
  GoogleCredential credential = new GoogleCredential.Builder()
  .setTransport(httpTransport)
  .setJsonFactory(jsonFactory)
  .setServiceAccountId(SERVICE_ACCOUNT_EMAIL)
  .setServiceAccountScopes(DirectoryScopes.ADMIN_DIRECTORY_USERS)
  .setServiceAccountUser(userEmail)
  .setServiceAccountPrivateKeyFromP12File(
      new java.io.File(SERVICE_ACCOUNT_PKCS12_FILE_PATH))
  .build();
  Directory service = new Directory.Builder(httpTransport, jsonFactory, null)
  .setHttpRequestInitializer(credential).build();

  Directory.Users.List request = service.users().list().setDomain(domain);

以上工作原理,但要求您在构建器上调用setServiceAccountUser(userEmail)方法。如果没有这个,当您执行请求时,您将获得403"未获得此资源/ api错误的授权"。这由几个现有问题记录,例如Google Apps Admin API: need to specify account user for service account?

但是你怎么知道userEmail?您无法知道域中的电子邮件,也无法获取域中的电子邮件列表。您可以存储首次安装该应用的管理员的电子邮件 - 但这似乎不合适且不够。如果此管理员帐户被删除或电子邮件地址发生变化,该怎么办?

1 个答案:

答案 0 :(得分:2)

无法在域上授予服务帐户管理员权限;他们必须冒充域管理员,因此需要一个电子邮件地址。建议的方法是存储安装了应用程序的管理员的电子邮件,或者有一个配置屏幕,用于设置要使用的管理员帐户的电子邮件。正如您所指出的,如果管理员帐户被删除或电子邮件发生变化,这种方法可能会有点脆弱。通过禁用应用程序并提醒用户管理员必须重新配置它来确保您处理这种情况。