Google Admin Directory API返回400个错误请求

我正在尝试使用Google Admin SDK的Java客户端,特别是Directory API。 它基于GoogleCredentials的使用,就像Google Drive API一样。 但是,与Google云端硬盘驱动器不同的是,我收到了400条错误的目录请求错误。 我按如下方式设置API:

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

最后一个execute()生成列在post底部的错误和堆栈跟踪。 我正在使用以下范围来授权自己。 我也可以使用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) 

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

你需要在这里添加这些信息:

 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 =授权问题。

解决方案是:

  HttpTransport httpTransport = new NetHttpTransport(); JacksonFactory jsonFactory = new JacksonFactory(); GoogleCredential credential; Collection SCOPES = new ArrayList(); 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 COnsole的服务帐户

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

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

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

  com.google.apis google-api-services-admin directory_v1-rev4-1.15.0-rc