我試圖讓我的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依賴關係。理想情況下,我真的應該選擇一個或另一個...
**沒有使用[OAuth插件](http://grails.org/plugin/oauth)或[Google for Spring Security OAuth插件](http://grails.org/plugin/)彈簧安全OAuth的谷歌)? – dmahapatro
第一眼看到兩個問題:1.不知道'httpTransport'來自哪裏,應該是'HTTP_TRANSPORT'。 2.你不需要'def servletContext'它可以在控制器製造中使用。 – dmahapatro
@dmahapatro沒有理由。只需遵循Google文檔。 httpTransport外殼是一個錯字。道歉。 – Spider