2013-04-14 23 views
7

Tôi đang cố gắng gọi bất kỳ API Google nào bằng quyền truy cập ủy quyền "Tài khoản dịch vụ". Tôi đã tải xuống tệp ".pk2" và đã kích hoạt "URL Shortener API" trong tab Dịch vụ của bảng điều khiển API của Google. Bất cứ khi nào tôi cố gắng gọi bất kỳ API (URL shortener hoặc Adsense). Tôi đã có ngoại lệ sau đây -Khoản trợ cấp không hợp lệ khi truy cập 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) 

Dưới đây là đoạn mã -

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

Trả lời

9

Trước hết "tài khoản Service" sẽ không làm việc cho Adsense, vì nó đòi hỏi phải có giấy phép sử dụng. Do đó cho Adsense bạn nên sử dụng Oauth 2.0. Khi bạn được ủy quyền lần đầu tiên sử dụng URL https://accounts.google.com/o/oauth2/token, hãy sao chép-dán và mã hóa mã thông báo làm mới của bạn. Hơn bạn có thể sử dụng nó để lấy mã thông báo truy cập, chỉ định client_id, client_secret và refresh_token của bạn để nhận mã thông báo truy cập mới. Bây giờ mã thông báo truy cập có thể được sử dụng trong ứng dụng của bạn.

Về lỗi của bạn, tôi đã gặp phải sự cố tương tự và dành nhiều thời gian để giải quyết vấn đề. Trước hết, hãy đảm bảo rằng bạn đang sử dụng ServiceAccountId hợp lệ - nó sẽ trỏ đến email kết thúc bằng "developer.gserviceaccount.com". Đảm bảo rằng bạn đã chỉ định phạm vi tài khoản và dịch vụ được kích hoạt trong API Google Console.

Tôi đã khắc phục sự cố này bằng cách đồng bộ hóa đồng hồ hệ thống trong máy của tôi.

Có rất nhiều chủ đề có lỗi tương tự mà không có câu trả lời. Thậm chí nhiều hơn, một số người nói rằng, đôi khi nó hoạt động, đôi khi nó trả về khoản trợ cấp không hợp lệ. Nó có thể hoạt động trên một máy và không hoạt động trên một máy khác. Tôi không biết đó có phải là vấn đề về đồng hồ hệ thống hay không, nhưng tôi sẽ tránh sử dụng API tài khoản dịch vụ, vì có vẻ như có lỗi và hỗ trợ sẽ không giúp bạn

Các vấn đề liên quan