2014-04-06 63 views
0

我試圖讓我的Groovy/Grails應用程序使用服務模型從Java到Google Calendar API。現在我會很滿意一個簡單的日曆列表。無論我做什麼,雖然,我結束了:如何使用OAuth 2.0訪問Google日曆(服務模型)?

URI: /test 
Class: com.google.api.client.auth.oauth2.TokenResponseException 
Message: 400 Bad Request { "error" : "invalid_grant" } 

相同的用戶「[email protected]」同時擁有日曆和API控制檯應用程序。代碼如下:

package quirkplanner 

import com.google.api.client.googleapis.auth.oauth2.GoogleCredential; 
import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport 
import com.google.api.client.http.HttpTransport 
import com.google.api.client.json.JsonFactory 
import com.google.api.client.json.jackson2.JacksonFactory; 
import com.google.api.services.calendar.Calendar 
import com.google.api.services.calendar.model.*; 

class TestController { 

    def servletContext 

    private static final HttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport(); 
    private static final JsonFactory JSON_FACTORY = new JacksonFactory(); 

    private static final String SERVICE_EMAIL = "[email protected]"; 
    private static final String CLIENT_ID = "123456789.apps.googleusercontent.com"; 
    private static final String PATH_TO_CERTIFICATE = "/WEB-INF/abcdefabcdef-privatekey.p12"; 
    private static final String SERVICE_ACCOUNT_USER="[email protected]"; 

    def index() { 

     GoogleCredential credential = new GoogleCredential.Builder().setTransport(HTTP_TRANSPORT) 
      .setJsonFactory(JSON_FACTORY) 
      .setServiceAccountId(SERVICE_EMAIL) 
      .setServiceAccountScopes(Collections.singleton("https://www.googleapis.com/auth/calendar")) 
      .setServiceAccountPrivateKeyFromP12File(new File(servletContext.getRealPath(PATH_TO_CERTIFICATE))) 
      .setServiceAccountUser(SERVICE_ACCOUNT_USER) 
      .build(); 

     Calendar service3 = new Calendar(HTTP_TRANSPORT, JSON_FACTORY, credential); 
     com.google.api.services.calendar.model.Calendar calendar = service3.calendars().get("primary").execute(); 

     render("ok") 
    } 
} 

BuildConfig.groovy依賴就是:

compile 'com.google.api-client:google-api-client:1.18.0-rc' 
    compile 'com.google.http-client:google-http-client-jackson2:1.18.0-rc' 

而且我也有JAR的我使用的列表。該列表不完整,因此是BuildConfig依賴關係。理想情況下,我真的應該選擇一個或另一個...

Image of the Grails lib folder

+0

**沒有使用[OAuth插件](http://grails.org/plugin/oauth)或[Google for Spring Security OAuth插件](http://grails.org/plugin/)彈簧安全OAuth的谷歌)? – dmahapatro

+0

第一眼看到兩個問題:1.不知道'httpTransport'來自哪裏,應該是'HTTP_TRANSPORT'。 2.你不需要'def servletContext'它可以在控制器製造中使用。 – dmahapatro

+0

@dmahapatro沒有理由。只需遵循Google文檔。 httpTransport外殼是一個錯字。道歉。 – Spider

回答

1

有幾件事情,可以嘗試:

  1. 刪除並重新 - 在Google控制檯中創建您的私鑰。
  2. 使用SERVICE_EMAIL地址在服務帳戶所有者的Google日曆中([email protected])共享其中一個日曆。
  3. 不要試圖冒充帳戶。刪除setServiceAccountUser(SERVICE_ACCOUNT_USER)

請務必使用SERVICE_EMAIL爲

.setServiceAccountId(SERVICE_EMAIL) 

因爲你已經正確。 Google的文檔不清楚,但使用服務帳戶ID不起作用。

祝你好運!

相關問題