2013-04-14 199 views
7

我試圖使用「服務帳戶」授權訪問調用任何Google API。我已經下載了「.pk2」文件,並在Google API控制檯的「服務」標籤中激活了「URL Shortener API」。每當我嘗試調用任何API(URL縮短器或AdSense)時。我有以下異常 -訪問Google API時的授權無效

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) 

下面的代碼片段 -

所有的「服務帳戶」的
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(); 

回答

9

首先不會爲Adsense的工作,因爲它需要用戶授權。因此,對於Adsense,您應該使用Oauth 2.0。當您首次使用URL https://accounts.google.com/o/oauth2/token進行授權時,請複製粘貼並硬編碼您的刷新令牌。你可以用它來獲取訪問令牌,指定client_id,client_secret和你的refresh_token來獲得新的訪問令牌。現在訪問令牌可以在您的應用程序中使用。

關於你的錯誤,我面臨類似的問題,並花費了大量的時間來解決它。首先,確保您使用的是有效的ServiceAccountId - 它應指向以「developer.gserviceaccount.com」結束的電子郵件。確保您在Google Console API中指定了帳戶範圍和激活的服務。

我通過在我的機器中同步系統時鐘來解決此問題。

有很多類似的錯誤沒有答案的話題。更有甚者,有人說,有時候它有效,有時會返回無效的贈款。它可以在一臺機器上運行並在另一臺機器上運行。我不知道這是否是系統時鐘問題,但我會避免使用服務帳戶API,因爲看起來像有錯誤和支持不會幫助你