2013-04-14 34 views
7

Próbuję wywołać dowolny interfejs API Google przy użyciu uprawnień dostępu do konta "Usługa". Pobrałem plik ".pk2" i aktywowałem "API skrótu URL" na karcie Usługi konsoli Google API. Za każdym razem, gdy próbuję wywołać dowolny interfejs API (narzędzie do skracania adresów URL lub AdSense). Mam następujący wyjątek -Nieprawidłowe przyznanie przy dostępie do interfejsu API 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) 

Poniżej fragment kodu -

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(); 

Odpowiedz

9

Przede wszystkim „konta Usługa” nie będzie pracować dla Adsense, ponieważ wymaga autoryzacji użytkownika. Dlatego dla Adsense powinieneś użyć Oauth 2.0. Po pierwszym uwierzytelnieniu przy użyciu adresu URL https://accounts.google.com/o/oauth2/token skopiuj i wklej kod odświeżania. Następnie możesz go użyć do uzyskania tokena dostępu, podać id_klienta, client_secret i swój refresh_token, aby uzyskać nowy token dostępu. Teraz token dostępu może być używany w twojej aplikacji.

W odniesieniu do Twojego błędu napotkałem podobny problem i spędziłem mnóstwo czasu, aby go rozwiązać. Przede wszystkim upewnij się, że używasz prawidłowego ServiceAccountId - powinien wskazywać na e-mail, który kończy się na "developer.gserviceaccount.com". Upewnij się, że określono zakresy kont i aktywowane usługi w interfejsie API konsoli Google.

Rozwiązałem ten problem, synchronizując zegar systemowy w moim komputerze.

Istnieje wiele tematów z podobnym błędem bez odpowiedzi. Co więcej, niektórzy ludzie mówią, że czasami to działa, czasami zwraca nieważne dotacje. Może działać na jednej maszynie, a na drugiej nie. Nie wiem, czy jest to problem z zegarem systemowym, ale unikałbym używania interfejsu API usługi, ponieważ wygląda na to, że są błędy i obsługa nie pomoże Ci