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

标签 java grails groovy oauth-2.0 google-api-java-client

我正在尝试让我的 Groovy/Grails 应用程序使用服务模型从 Java 与 Google Calendar API 进行交互。现在我会对一个简单的日历列表感到满意。不管我做什么,我最终都会得到:

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

最佳答案

有一些事情可以尝试:

  1. 在 Google Console 中删除并重新创建您的私钥。
  2. 与 SERVICE_EMAIL 地址共享服务帐户所有者 (googleaccounts@quirk.biz) 的 Google 日历中的日历之一。
  3. 请勿尝试冒充帐户。删除 setServiceAccountUser(SERVICE_ACCOUNT_USER)

请务必使用 SERVICE_EMAIL

.setServiceAccountId(SERVICE_EMAIL)

正如您所做的那样。 Google 的文档对此并不清楚,但使用服务帐户 ID 是行不通的。

祝你好运!

关于java - 如何使用 OAuth 2.0 访问 Google 日历(服务模型)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22893725/

相关文章:

java - 我一直在获取java.lang.illegalstateexception?

open-source - 我可以学习的 Great Grails 开源应用程序

grails - Grails 2.5,Delete无法访问一对多关系之前

java - Micronaut自定义验证约束,根据值编写自定义消息

Jenkins 解释一行上的多个对象声明

java - OAF 如何将带有搜索字段的高级表添加到标准现有页面(EBS 12.1)?

java - 为什么这会将类型解析为接口(interface)?

java - 检查远程计算机上是否存在目录并复制其中的文件

grails - 在Grail的子类审核日志中获取父名称为null

hibernate - grails/hibernate:在作业中获取org.hibernate.StaleStateException