无法为会议室资源日历创建事件的技术问题咨询
问题描述
已配置具备Domain-wide delegation权限的Google服务账号,使用Google Calendar APIs管理日历事件。示例代码如下:
InputStream inputstream = null; try { inputstream = new ByteArrayInputStream(this.key); Credential cred = new GoogleCredential.Builder().setTransport(new NetHttpTransport()) .setJsonFactory(new JacksonFactory()) .setServiceAccountId(cs.getGoogleServiceAccountId()) .setServiceAccountScopes(Arrays.asList(CalendarScopes.CALENDAR)) .setServiceAccountUser("c_188d28jockafkhljibdpn05gio6iq@resource.calendar.google.com") .setServiceAccountPrivateKey(SecurityUtils.loadPrivateKeyFromKeyStore(SecurityUtils.getPkcs12KeyStore(), inputstream,"notasecret", "privatekey", "notasecret")) .build(); calendar = new Calendar.Builder(new NetHttpTransport(), new JacksonFactory(), cred).setApplicationName("applicationName").build(); Event e = new Event().setSummary("Test"); e.setDescription("Test"); e.setStart(new EventDateTime().setDateTime(new DateTime(new Date().getTime()))); e.setStart(new EventDateTime().setDateTime(new DateTime(DateUtils.addHours(new Date(), 1).getTime()))); Event insert = calendar.events().insert("c_188d28jockafkhljibdpn05gio6iq@resource.calendar.google.com", e).setSendNotifications(true).execute(); logger.info("event created = {}", JsonUtil.getJSONString(insert)); } finally { if(inputstream != null) { inputstream.close(); } }
尝试为会议室资源日历创建事件时,出现如下异常:
com.google.api.client.auth.oauth2.TokenResponseException: 400 Bad Request POST https://oauth2.googleapis.com/token { "error" : "invalid_grant", "error_description" : "Invalid email or User ID" } at com.google.api.client.auth.oauth2.TokenResponseException.from(TokenResponseException.java:105) at com.google.api.client.auth.oauth2.TokenRequest.executeUnparsed(TokenRequest.java:326) at com.google.api.client.auth.oauth2.TokenRequest.execute(TokenRequest.java:346) at com.google.api.client.googleapis.auth.oauth2.GoogleCredential.executeRefreshToken(GoogleCredential.java:397) at com.google.api.client.auth.oauth2.Credential.refreshToken(Credential.java:494) at com.google.api.client.auth.oauth2.Credential.intercept(Credential.java:217) at com.google.api.client.http.HttpRequest.execute(HttpRequest.java:880) at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.executeUnparsed(AbstractGoogleClientRequest.java:541) at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.executeUnparsed(AbstractGoogleClientRequest.java:474) at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.execute(AbstractGoogleClientRequest.java:591)
将资源邮箱ID替换为普通用户邮箱后,可为任意活跃用户日历创建事件且运行正常,请问问题出在哪里?
解决方案
- 核心问题:
setServiceAccountUser参数仅支持指定域内普通用户账号邮箱,不能填入资源日历邮箱。资源日历属于Google Workspace的资源实体,不属于用户账号范畴,服务账号尝试模拟它时会触发invalid_grant错误。 - 正确操作:移除
setServiceAccountUser的调用,直接借助已配置域全权限的服务账号发起请求,在events().insert方法中传入资源日历ID即可完成事件创建。 - 额外修复:代码中重复调用
e.setStart导致事件结束时间未设置,需将第二个setStart改为setEnd,否则事件会因时间参数无效被拒绝。
修改后的核心代码片段:
Credential cred = new GoogleCredential.Builder().setTransport(new NetHttpTransport()) .setJsonFactory(new JacksonFactory()) .setServiceAccountId(cs.getGoogleServiceAccountId()) .setServiceAccountScopes(Arrays.asList(CalendarScopes.CALENDAR)) // 移除setServiceAccountUser调用 .setServiceAccountPrivateKey(SecurityUtils.loadPrivateKeyFromKeyStore(SecurityUtils.getPkcs12KeyStore(), inputstream,"notasecret", "privatekey", "notasecret")) .build(); // 修复事件时间设置 Event e = new Event().setSummary("Test"); e.setDescription("Test"); e.setStart(new EventDateTime().setDateTime(new DateTime(new Date().getTime()))); e.setEnd(new EventDateTime().setDateTime(new DateTime(DateUtils.addHours(new Date(), 1).getTime()))); // 改为setEnd Event insert = calendar.events().insert("c_188d28jockafkhljibdpn05gio6iq@resource.calendar.google.com", e).setSendNotifications(true).execute();
内容的提问来源于stack exchange,提问作者Kushal Chokhani
相关产品推荐
相关产品推荐

