2013-04-14 19 views
7

"Hizmet hesabı" yetkilendirme erişimini kullanarak Google API’ndan herhangi birini çağırmaya çalışıyorum. Google API konsolunun Hizmetler sekmesinde ".pk2" dosyasını indirip "URL Shortener API" özelliğini etkinleştirdim. Ne zaman bir API (URL kısaltıcı veya Adsense) çağırmaya çalışıyorum. Ben şu istisna var -Google API'ye erişirken geçersiz hibe

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) 

Aşağıda kod parçacığı - tüm "Hizmet hesabı" nin

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

cevap

9

Önce kullanıcı yetkilendirme gerekiyor çünkü Adsense için çalışmaz. Bu nedenle Adsense için Oauth 2.0 kullanmalısınız. URL'yi https://accounts.google.com/o/oauth2/token URL'sini kullanarak ilk kez yetkilendirdiğinizde, kopyala yapıştırıp yenileme kodunuzu kodlayın. Daha fazla erişim belirteci almak için kullanabilirsiniz, yeni erişim belirteci almak için client_id, client_secret ve refresh_token değerini belirtin. Şimdi erişim belirteci uygulamanızda kullanılabilir.

Hatanızla ilgili olarak, benzer bir sorunla karşılaştım ve çözmek için çok zaman harcadım. Her şeyden önce, geçerli ServiceAccountId kullandığınızdan emin olun - "developer.gserviceaccount.com" ile biten e-postaya işaret etmelidir. Google Console API'sında hesap kapsamlarını ve etkinleştirilmiş hizmetleri belirttiğinizden emin olun.

Bu sorunu makinemdeki sistem saatini senkronize ederek düzelttim.

Yanıt olmadan benzer hatayı içeren birçok konu var. Dahası, bazı insanlar diyor ki, bazen işe yarıyor, bazen geçersiz hibe veriyor. Tek bir makinede çalışabilir ve diğerinde başarısız olabilir. Sistem saat sorunu olup olmadığını bilmiyorum, ama Service Account API kullanmaktan kaçınıyorum çünkü hatalar ve destek size yardımcı olamıyor

İlgili konular