代码之家  ›  专栏  ›  技术社区  ›  sparkyspider

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

  •  0
  • sparkyspider  · 技术社区  · 10 年前

    我正在尝试让Groovy/Grails应用程序使用服务模型从Java与GoogleCalendarAPI对话。现在,我会很高兴看到一个简单的日历列表。不管我做什么,我最终都是:

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

    同一用户“googleaccounts@quirk.biz“同时拥有日历和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 = "12345678901234-abcdefabcdef@developer.gserviceaccount.com";
        private static final String CLIENT_ID = "12345678901234.apps.googleusercontent.com";
        private static final String PATH_TO_CERTIFICATE = "/WEB-INF/abcdefabcdef-privatekey.p12";
        private static final String SERVICE_ACCOUNT_USER="my-google-admin-user@quirk.biz";
    
        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

    2 回复  |  直到 7 年前
        1
  •  1
  •   Glen    10 年前

    有一些事情可以尝试:

    1. 在Google控制台中删除并重新创建您的私钥。
    2. 在服务帐户所有者的Google日历中共享其中一个日历(googleaccounts@quirk.biz)带有SERVICE_EMAIL地址。
    3. 不要尝试模拟帐户。去除 setServiceAccountUser(SERVICE_ACCOUNT_USER)

    确保使用SERVICE_EMAIL

    .setServiceAccountId(SERVICE_EMAIL)
    

    正如你正确地做的那样。谷歌的文档对此并不清楚,但使用服务帐户ID将不起作用。

    祝你好运