1

我正在尝试使用 Google Admin API 获取和更新我的域的用户。

  private static final JsonFactory JSON_FACTORY = JacksonFactory.getDefaultInstance();
  private static final List<String> SCOPES = Arrays.asList(
      "https://www.googleapis.com/auth/admin.directory.user",
      "https://www.googleapis.com/auth/admin.directory.user.readonly");

  public static void main(String[] args) {
    try {
      HttpTransport httpTransport = new NetHttpTransport();


      GoogleCredential credential =
          new GoogleCredential.Builder()
              .setTransport(httpTransport)
              .setJsonFactory(JSON_FACTORY)
              .setServiceAccountId(
                  "xxxxx-yyyyy@developer.gserviceaccount.com")
              .setServiceAccountUser("superadmin@mydomain.com")
              .setServiceAccountScopes(SCOPES)
              .setServiceAccountPrivateKeyFromP12File(
                  new File("C:\\privatekey.p12")).build();

      Directory admin =
          new Directory.Builder(httpTransport, JSON_FACTORY, credential)
              .setApplicationName("User Sync Service")
              .setHttpRequestInitializer(credential).build();

      Directory.Users.List list = admin.users().list();
      Users users = list.execute();
      System.out.println("************");
    } catch (Exception e) {
      e.printStackTrace();
    }
  }

从我的谷歌控制台

在此处输入图像描述 在此处输入图像描述

  1. 从我的安全面板启用 API 访问
  2. ServiceAccountUser 是超级管理员。

但我仍然收到此错误

com.google.api.client.auth.oauth2.TokenResponseException: 400 Bad Request
{
  "error" : "access_denied"
}
    at com.google.api.client.auth.oauth2.TokenResponseException.from(TokenResponseException.java:105)
    at com.google.api.client.auth.oauth2.TokenRequest.executeUnparsed(TokenRequest.java:287)
    at com.google.api.client.auth.oauth2.TokenRequest.execute(TokenRequest.java:307)
    at com.google.api.client.googleapis.auth.oauth2.GoogleCredential.executeRefreshToken(GoogleCredential.java:269)
    at com.google.api.client.auth.oauth2.Credential.refreshToken(Credential.java:489)
    at com.google.api.client.auth.oauth2.Credential.intercept(Credential.java:217)
    at com.google.api.client.http.HttpRequest.execute(HttpRequest.java:858)
    at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.executeUnparsed(AbstractGoogleClientRequest.java:410)
    at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.executeUnparsed(AbstractGoogleClientRequest.java:343)
    at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.execute(AbstractGoogleClientRequest.java:460)

更新: 来自 ManageOath 的截图

在此处输入图像描述

4

3 回答 3

3

看起来文档对客户和域有些模棱两可。必须指定其中之一。您可以customer在使用 list() 函数时设置属性。它应该设置为客户的 ID(一个唯一的、随机的字符串),或者,如果您已经在 Google Apps 实例中以管理员身份进行身份验证,您可以只指定customer=my_customer. 或者,您可以指定domain=example.comexample.com 是 Google Apps 实例中的主域或辅助域。指定域时,只有在该域中具有主要(家庭)地址的用户才会在结果中返回。指定客户时,将返回 Google Apps 实例中的所有用户。

您可以使用Google API Explorer确认这一点。将客户留空总是会导致错误。但是,放置my_customer客户属性应该可以解决它。

于 2013-09-10T12:47:47.020 回答
1

您需要指定域或客户参数:

Directory.Users.List list = admin.users().list()
   .setDomain("<target_domain>");

// or

Directory.Users.List list = admin.users().list()
   .setCustomer("<target_customer_id>");

我提交了一个错误来更新文档,以明确这两个参数中的至少一个是必需的。

于 2013-09-10T22:16:17.730 回答
0

继续访问https://admin.google.com/ yourdomain /ManageOauthClients 并检查是否为您的 xxxxxxxxxxxxxxxxxx.apps.googleusercontent.com 服务帐户 ID 添加了这些范围。

于 2013-09-10T10:59:41.470 回答