6

我正在试验 Google Admin SDK 的 Java 客户端,特别是 Directory API。它基于 GoogleCredentials 的使用,就像 Google Drive API 一样。但是,与 Google Drive 不同,我收到了 400 - Directory 的错误请求错误。我将 API 设置如下:

Directory directory = new Directory.Builder(TRANSPORT, FACTORY, credential).build();
Directory.Users.List list = directory.users().list();
Users users = list.execute();

最后一个 execute() 会产生帖子底部列出的错误和堆栈跟踪。我正在使用以下范围来授权自己。如您所见,我也使用 Drive API。

https://www.googleapis.com/auth/userinfo.profile
https://www.googleapis.com/auth/userinfo.email
https://www.googleapis.com/auth/drive
https://www.googleapis.com/auth/admin.directory.user

访问 Drive API 就像一个魅力。我可以毫无问题地请求文件。但是,如果我对 Directory API 执行一个简单的操作,我会得到下面列出的错误和堆栈跟踪。我应该提一下,Drive API 和 Directory API 都引用了我作为管理员的同一个 Google Apps 域。我还在 Google API 控制台中启用了这两个 API。剩下的,我不知道我做错了什么,我想知道是否有其他人看到过类似的东西,或者有通过 Java 客户端访问这个 API 的经验。

谢谢,

拉尔夫

[ERROR] com.google.api.client.googleapis.json.GoogleJsonResponseException: 400 OK
[ERROR] {
[ERROR]   "code" : 400,
[ERROR]   "errors" : [ {
[ERROR]     "domain" : "global",
[ERROR]     "message" : "Bad Request",
[ERROR]     "reason" : "badRequest"
[ERROR]   } ],
[ERROR]   "message" : "Bad Request"
[ERROR] }
[ERROR]     at com.google.api.client.googleapis.json.GoogleJsonResponseException.from(GoogleJsonResponseException.java:145)
[ERROR]     at com.google.api.client.googleapis.services.json.AbstractGoogleJsonClientRequest.newExceptionOnError(AbstractGoogleJsonClientRequest.java:111)
[ERROR]     at com.google.api.client.googleapis.services.json.AbstractGoogleJsonClientRequest.newExceptionOnError(AbstractGoogleJsonClientRequest.java:38)
[ERROR]     at com.google.api.client.googleapis.services.AbstractGoogleClientRequest$1.interceptResponse(AbstractGoogleClientRequest.java:312)
[ERROR]     at com.google.api.client.http.HttpRequest.execute(HttpRequest.java:1042)
[ERROR]     at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.executeUnparsed(AbstractGoogleClientRequest.java:410)
[ERROR]     at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.executeUnparsed(AbstractGoogleClientRequest.java:343)
[ERROR]     at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.execute(AbstractGoogleClientRequest.java:460)
[ERROR]     at com.arcus.example.server.api.DirectoryAPI.getEmails(DirectoryAPI.java:29)
[ERROR]     at com.arcus.example.server.action.CreateExampleDelegate.execute(CreateExampleDelegate.java:29)
[ERROR]     at com.arcus.example.server.action.CreateExampleActionHandler.execute(CreateExampleActionHandler.java:28)
[ERROR]     at com.arcus.example.server.action.CreateExampleActionHandler.execute(CreateExampleActionHandler.java:13)
[ERROR]     at com.gwtplatform.dispatch.server.AbstractDispatchImpl.doExecute(AbstractDispatchImpl.java:156)
[ERROR]     at com.gwtplatform.dispatch.server.AbstractDispatchImpl.execute(AbstractDispatchImpl.java:112)
[ERROR]     at com.gwtplatform.dispatch.server.AbstractDispatchServiceImpl.execute(AbstractDispatchServiceImpl.java:84)
[ERROR]     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
[ERROR]     at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
[ERROR]     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
[ERROR]     at java.lang.reflect.Method.invoke(Method.java:601)
[ERROR]     at com.google.gwt.user.server.rpc.RPC.invokeAndEncodeResponse(RPC.java:561)
[ERROR]     at com.google.gwt.user.server.rpc.RemoteServiceServlet.processCall(RemoteServiceServlet.java:208)
[ERROR]     at com.google.gwt.user.server.rpc.RemoteServiceServlet.processPost(RemoteServiceServlet.java:248)
[ERROR]     at com.google.gwt.user.server.rpc.AbstractRemoteServiceServlet.doPost(AbstractRemoteServiceServlet.java:62)
[ERROR]     at javax.servlet.http.HttpServlet.service(HttpServlet.java:637)
[ERROR]     at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
[ERROR]     at com.google.inject.servlet.ServletDefinition.doService(ServletDefinition.java:263)
[ERROR]     at com.google.inject.servlet.ServletDefinition.service(ServletDefinition.java:178)
[ERROR]     at com.google.inject.servlet.ManagedServletPipeline.service(ManagedServletPipeline.java:91)
[ERROR]     at com.google.inject.servlet.FilterChainInvocation.doFilter(FilterChainInvocation.java:62)
[ERROR]     at com.gwtplatform.dispatch.server.AbstractHttpSessionSecurityCookieFilter.doFilter(AbstractHttpSessionSecurityCookieFilter.java:69)
[ERROR]     at com.google.inject.servlet.FilterDefinition.doFilter(FilterDefinition.java:163)
[ERROR]     at com.google.inject.servlet.FilterChainInvocation.doFilter(FilterChainInvocation.java:58)
[ERROR]     at com.google.inject.servlet.ManagedFilterPipeline.dispatch(ManagedFilterPipeline.java:118)
[ERROR]     at com.google.inject.servlet.GuiceFilter.doFilter(GuiceFilter.java:113)
[ERROR]     at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
[ERROR]     at com.google.appengine.api.socket.dev.DevSocketFilter.doFilter(DevSocketFilter.java:74)
[ERROR]     at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
[ERROR]     at com.google.appengine.tools.development.ResponseRewriterFilter.doFilter(ResponseRewriterFilter.java:123)
[ERROR]     at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
[ERROR]     at com.google.appengine.tools.development.HeaderVerificationFilter.doFilter(HeaderVerificationFilter.java:34)
[ERROR]     at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
[ERROR]     at com.google.appengine.api.blobstore.dev.ServeBlobFilter.doFilter(ServeBlobFilter.java:63)
[ERROR]     at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
[ERROR]     at com.google.apphosting.utils.servlet.TransactionCleanupFilter.doFilter(TransactionCleanupFilter.java:43)
[ERROR]     at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
[ERROR]     at com.google.appengine.tools.development.StaticFileFilter.doFilter(StaticFileFilter.java:125)
[ERROR]     at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
[ERROR]     at com.google.appengine.tools.development.DevAppServerServersFilter.doDirectRequest(DevAppServerServersFilter.java:369)
[ERROR]     at com.google.appengine.tools.development.DevAppServerServersFilter.doDirectServerRequest(DevAppServerServersFilter.java:352)
[ERROR]     at com.google.appengine.tools.development.DevAppServerServersFilter.doFilter(DevAppServerServersFilter.java:115)
[ERROR]     at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
[ERROR]     at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:388)
[ERROR]     at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216)
[ERROR]     at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:182)
[ERROR]     at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:765)
[ERROR]     at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:418)
[ERROR]     at com.google.appengine.tools.development.DevAppEngineWebAppContext.handle(DevAppEngineWebAppContext.java:97)
[ERROR]     at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)
[ERROR]     at com.google.appengine.tools.development.JettyContainerService$ApiProxyHandler.handle(JettyContainerService.java:438)
[ERROR]     at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)
[ERROR]     at org.mortbay.jetty.Server.handle(Server.java:326)
[ERROR]     at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:542)
[ERROR]     at org.mortbay.jetty.HttpConnection$RequestHandler.content(HttpConnection.java:938)
[ERROR]     at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:755)
[ERROR]     at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:218)
[ERROR]     at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:404)
[ERROR]     at org.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:409)
[ERROR]     at org.mortbay.thread.QueuedThreadPool$PoolThread.run(QueuedThreadPool.java:582)
4

3 回答 3

8

解决方案是:

    HttpTransport httpTransport = new NetHttpTransport();
    JacksonFactory jsonFactory = new JacksonFactory();

    GoogleCredential credential;

    Collection<String> SCOPES = new ArrayList<String>();
    SCOPES.add("https://www.googleapis.com/auth/admin.directory.user");



    credential = new GoogleCredential.Builder().setTransport(httpTransport)
            .setJsonFactory(jsonFactory)
             .setServiceAccountId(SERVICE_ACCOUNT_EMAIL)
             .setServiceAccountUser("adminEmail@yourDomain.com")
             .setServiceAccountScopes(SCOPES)
             .setServiceAccountPrivateKeyFromP12File(
             new java.io.File(SERVICE_ACCOUNT_PKCS12_FILE_PATH))
            .build();

    Directory directory = new Directory.Builder(httpTransport, jsonFactory, credential).build();

    Directory.Users.List list = directory.users().list();
    list.setDomain("yourDomain.com");
    Users users = list.execute();

SERVICE_ACCOUNT_PKCS12_FILE_PATH = 密钥的文件位置(API 控制台)SERVICE_ACCOUNT_EMAIL = API 控制台中的服务帐户

从您的域的控制面板添加范围,使用方法服务帐户 https://developers.google.com/drive/delegation

并在您的 API 控制台中激活 Admin SDK。

于 2013-06-04T17:38:24.980 回答
8

问题是您没有指定要使用的用户或要使用的域,

您需要在此处添加此信息:

Directory directory = new Directory.Builder(TRANSPORT, FACTORY, credential).build();
Directory.Users.List list = directory.users().list();
list.setCustomer("name.surname@yourdomain.com");
Users users = list.execute();

现在,如果您有权限问题,错误的返回码将是 403 = 授权问题。

于 2013-05-30T13:03:13.990 回答
-1

如果您使用的是 Maven,只需将以下内容添加到您的 pom.xml 中:

<dependency>
    <groupId>com.google.apis</groupId>
    <artifactId>google-api-services-admin</artifactId>
    <version>directory_v1-rev4-1.15.0-rc</version>
</dependency>
于 2013-06-02T13:09:29.277 回答