如何使用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依赖关系。理想情况下,我真的应该选择一个或另一个...
答
有几件事情,可以尝试:
- 删除并重新 - 在Google控制台中创建您的私钥。
- 使用SERVICE_EMAIL地址在服务帐户所有者的Google日历中([email protected])共享其中一个日历。
- 不要试图冒充帐户。删除
setServiceAccountUser(SERVICE_ACCOUNT_USER)
请务必使用SERVICE_EMAIL为
.setServiceAccountId(SERVICE_EMAIL)
因为你已经正确。 Google的文档不清楚,但使用服务帐户ID不起作用。
祝你好运!
**没有使用[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