2013-04-14 9 views
7

Sto tentando di richiamare qualsiasi API di Google utilizzando l'accesso di autorizzazione "Account servizio". Ho scaricato il file ".pk2" e attivato "URL Shortener API" nella scheda Servizi della console dell'API di Google. Ogni volta che provo a richiamare qualsiasi API (abbreviazione URL o Adsense). Ho seguente eccezione -Concessione non valida durante l'accesso all'API di Google

com.google.api.client.auth.oauth2.TokenResponseException: 400 Bad Request 
{ 
    "error" : "invalid_grant" 
} 
    at com.google.api.client.auth.oauth2.TokenResponseException.from(TokenResponseException.java:105) 
    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:345) 
    at com.google.api.client.auth.oauth2.Credential.refreshToken(Credential.java:526) 
    at com.google.api.client.auth.oauth2.Credential.intercept(Credential.java:287) 
    at com.google.api.client.http.HttpRequest.execute(HttpRequest.java:836) 
    at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.executeUnparsed(AbstractGoogleClientRequest.java:412) 
    at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.executeUnparsed(AbstractGoogleClientRequest.java:345) 
    at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.execute(AbstractGoogleClientRequest.java:463) 

seguito è frammento di codice -

HttpTransport HTTP_TRANSPORT = new NetHttpTransport(); 
    JsonFactory JSON_FACTORY = new JacksonFactory(); 
    File privateKey = new File(ReportAdsense.class.getResource("mykey.p12").toURI()); 
    GoogleCredential credential = new GoogleCredential.Builder().setTransport(HTTP_TRANSPORT) 
      .setJsonFactory(JSON_FACTORY) 
      .setServiceAccountId("[email protected]") 
      .setServiceAccountScopes(UrlshortenerScopes.URLSHORTENER) 
      .setServiceAccountPrivateKeyFromP12File(privateKey) 
      .build(); 
    Urlshortener service = new Urlshortener.Builder(new NetHttpTransport(), JSON_FACTORY, null).setHttpRequestInitializer(credential).build(); 
    UrlHistory history = service.url().list().execute(); 

risposta

9

Prima di tutto "account del servizio" non funziona per Adsense, dal momento che richiede l'autorizzazione dell'utente. Quindi per Adsense dovresti usare Oauth 2.0. Quando sei autorizzato per la prima volta utilizzando l'URL https://accounts.google.com/o/oauth2/token, copia-incolla e hardcode il tuo token di aggiornamento. Quindi puoi usarlo per ottenere il token di accesso, specificare client_id, client_secret e il tuo refresh_token per ottenere un nuovo token di accesso. Ora il token di accesso può essere utilizzato nella tua applicazione.

Per quanto riguarda il tuo errore, ho affrontato un problema simile e ho trascorso un sacco di tempo per risolverlo. Prima di tutto, assicurati di utilizzare ServiceAccountId valido: dovrebbe puntare alla posta elettronica che termina con "developer.gserviceaccount.com". Assicurati di aver specificato gli ambiti dell'account e i servizi attivati ​​nell'API di Google Console.

Ho risolto questo problema sincronizzando l'orologio di sistema nella mia macchina.

Ci sono molti argomenti con errore simile senza risposte. Ancor più, alcune persone dicono che a volte funziona, a volte restituisce una sovvenzione non valida. Potrebbe funzionare su una macchina e fallire su un'altra. Non so se si tratta di un problema con l'orologio di sistema, ma eviterei di utilizzare l'API dell'account di servizio, poiché sembra che ci siano errori e il supporto non ti aiuterà

Problemi correlati