2012-11-06 24 views
5

Ok! Come afferma il titolo, ho riscontrato seri problemi con l'autenticazione quando utilizzo un account di servizio. Quindi partiamo dall'inizio visto che ho provato tutto!Concessione non valida quando si chiama Java Google Drive Api con account di servizio

servizi impostati su:

enter image description here

Unità SDK di installazione:

enter image description here

account di servizio Api di accesso:

accesso client

enter image description here

Api come descritto qui: http://support.google.com/a/bin/answer.py?hl=en&answer=162106

enter image description here

Il codice:

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. 
     } 
} 

L'eccezione:

[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) 

Ho navigato sul web da 3 ore e tutte le persone PHP e Python sembrano averlo risolto impostando l'ora corretta sul loro server di produzione Linux. Sono seduto in MacOS Snow Leopard e ho provato con l'impostazione dell'ora ma senza fortuna. Ho anche provato a creare una nuova chiave. Cambiando gli ambiti. Aggiunta di ServiceAccountUser diversi e così via. Probabilmente mi manca qualche parte cruciale o forse è supersemplice? Sono a corto di idee!

risposta

5

Hai provato solo scopo:

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

e,

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

dovrebbe essere

.setServiceAccountId("[email protected]") 

Gli altri scopi sono richiesti per i fogli di calcolo, essi non sono tenuti (ancora).

anche, vedere questo correlato question

+0

Hmm ottenere un com.google.api.client.googleapis.json.GoogleJsonResponseException: 500 Errore { "codice" Internal Server : 500, "errori": [{ "dominio":, "messaggio" "globale": "errore interno", "ragione": "InternalError" }], "messaggio" : "errore interno" } – jakob

+0

un nuovo giorno, un nuovo errore . Hai questo errore ogni volta? –

+0

haha ​​sì! Ogni volta! Ma funziona con analytics =) – jakob

Problemi correlati