2012-11-06 60 views
5

好的!正如标题所述,我在使用服务帐户时遇到了一些认证问题。所以让我们从头开始,因为它感觉我已经尝试了一切!使用服务帐户调用Java Google Drive API时的授权无效

服务设置为on:

enter image description here

驱动器SDK设置:

enter image description here

服务帐户的API访问权限:

如这里所述

enter image description here

API客户端访问:http://support.google.com/a/bin/answer.py?hl=en&answer=162106

enter image description here

的代码:

public static void callSpreadsheetApi() { 

     GoogleCredential credential = null; 
     try { 
      credential = new GoogleCredential.Builder().setTransport(HTTP_TRANSPORT) 
        .setJsonFactory(JSON_FACTORY)      
        .setServiceAccountId("2363XXXXXX19.apps.googleusercontent.com")      
        .setServiceAccountScopes(DriveScopes.DRIVE, "https://spreadsheets.google.com/feeds", "https://docs.google.com/feeds") 
        .setServiceAccountPrivateKeyFromP12File(new File("/Users/stevesmith/Desktop/c02e064935d33c3389f6ab1dbf9ea747a5bdaac5-privatekey.p12")) 
        .setServiceAccountUser("[email protected]") 
        .build(); 

     } catch (GeneralSecurityException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 


     Drive drive = new Drive.Builder(HTTP_TRANSPORT, JSON_FACTORY, credential).build(); 

     com.google.api.services.drive.model.File file = new com.google.api.services.drive.model.File(); 
     file.setTitle("test"); 
     file.setMimeType("application/vnd.google-apps.spreadsheet"); 
     Drive.Files.Insert insert = null; 
     try { 
      insert = drive.files().insert(file); 
      file = insert.execute(); 
     } catch (IOException e) { 
      e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates. 
     } 
} 

例外:

[info] play - Application started (Dev) 
com.google.api.client.auth.oauth2.TokenResponseException: 400 Bad Request 
{ 
    "error" : "invalid_grant" 
} 
    at com.google.api.client.auth.oauth2.TokenResponseException.from(TokenResponseException.java:103) 
    at com.google.api.client.auth.oauth2.TokenRequest.executeUnparsed(TokenRequest.java:303) 
    at com.google.api.client.auth.oauth2.TokenRequest.execute(TokenRequest.java:323) 
    at com.google.api.client.googleapis.auth.oauth2.GoogleCredential.executeRefreshToken(GoogleCredential.java:340) 
    at com.google.api.client.auth.oauth2.Credential.refreshToken(Credential.java:505) 
    at com.google.api.client.auth.oauth2.Credential.intercept(Credential.java:266) 
    at com.google.api.client.http.HttpRequest.execute(HttpRequest.java:857) 
    at com.google.api.client.googleapis.json.GoogleJsonResponseException.execute(GoogleJsonResponseException.java:182) 
    at com.google.api.client.googleapis.services.GoogleClient.executeUnparsed(GoogleClient.java:279) 
    at com.google.api.client.http.json.JsonHttpRequest.executeUnparsed(JsonHttpRequest.java:207) 
    at com.google.api.services.drive.Drive$Files$Insert.executeUnparsed(Drive.java:307) 
    at com.google.api.services.drive.Drive$Files$Insert.execute(Drive.java:331) 
    at services.GoogleService.callSpreadsheetApi(GoogleService.java:236) 
    at controllers.Application.index(Application.java:26) 
    at Routes$$anonfun$routes$1$$anonfun$apply$1$$anonfun$apply$2.apply(routes_routing.scala:32) 
    at Routes$$anonfun$routes$1$$anonfun$apply$1$$anonfun$apply$2.apply(routes_routing.scala:32) 
    at play.core.Router$HandlerInvoker$$anon$5$$anon$1.invocation(Router.scala:1090) 
    at play.core.j.JavaAction$$anon$1.call(JavaAction.scala:33) 
    at play.core.j.JavaAction$class.apply(JavaAction.scala:74) 
    at play.core.Router$HandlerInvoker$$anon$5$$anon$1.apply(Router.scala:1089) 
    at play.core.ActionInvoker$$anonfun$receive$1$$anonfun$6.apply(Invoker.scala:126) 
    at play.core.ActionInvoker$$anonfun$receive$1$$anonfun$6.apply(Invoker.scala:126) 
    at play.utils.Threads$.withContextClassLoader(Threads.scala:17) 
    at play.core.ActionInvoker$$anonfun$receive$1.apply(Invoker.scala:125) 
    at play.core.ActionInvoker$$anonfun$receive$1.apply(Invoker.scala:115) 
    at akka.actor.Actor$class.apply(Actor.scala:318) 
    at play.core.ActionInvoker.apply(Invoker.scala:113) 
    at akka.actor.ActorCell.invoke(ActorCell.scala:626) 
    at akka.dispatch.Mailbox.processMailbox(Mailbox.scala:197) 
    at akka.dispatch.Mailbox.run(Mailbox.scala:179) 
    at akka.dispatch.ForkJoinExecutorConfigurator$MailboxExecutionTask.exec(AbstractDispatcher.scala:516) 
    at akka.jsr166y.ForkJoinTask.doExec(ForkJoinTask.java:259) 
    at akka.jsr166y.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:975) 
    at akka.jsr166y.ForkJoinPool.runWorker(ForkJoinPool.java:1479) 
    at akka.jsr166y.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:104) 

我一直在浏览网页过去的3个小时,所有的PHP和Python人似乎都通过在他们的linux生产服务器上设置正确的时间来解决它。我坐在MacOS Snow Leopard中,我尝试了时间设置,但没有运气。我也尝试创建一个新的密钥。更改范围。添加不同的ServiceAccountUsers等等。我可能错过了一些关键部分或者它可能是超级简单的?我正在用尽想法!

回答

5

你尝试单范围:

.setServiceAccountScopes("https://www.googleapis.com/auth/drive") 

,并

.setServiceAccountId("23636812XXXX.apps.googleusercontent.com") 

应该

.setServiceAccountId("[email protected]") 

的其他范围都需要的电子表格,它们不是必需的(然而)。

也看到这个相关question

+0

嗯得到一个com.google.api.client.googleapis.json.GoogleJsonResponseException:500内部服务器错误 { “代码”:500, “错误”:[{ “域”: “全局”, “消息”: “内部错误”, “理由”: “InternalError该” }], “消息”: “内部错误” } – jakob

+0

新的一天,新的错误。你每次都得到这个错误吗? –

+0

哈哈是啊!每次!但它适用于分析=) – jakob

相关问题