如何使用OAuth 2.0访问Google日历(服务模型)?

问题描述:

我试图让我的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. 删除并重新 - 在Google控制台中创建您的私钥。
  2. 使用SERVICE_EMAIL地址在服务帐户所有者的Google日历中([email protected])共享其中一个日历。
  3. 不要试图冒充帐户。删除setServiceAccountUser(SERVICE_ACCOUNT_USER)

请务必使用SERVICE_EMAIL为

.setServiceAccountId(SERVICE_EMAIL) 

因为你已经正确。 Google的文档不清楚,但使用服务帐户ID不起作用。

祝你好运!