首先,让我解释一下我要做什么,因为这是一个两部分的问题。
我正在构建一个 JAX-RS 服务,该服务通过 OAuth2 在内部使用 Google 帐户进行身份验证,因此它可以访问和操作 Google 日历。该服务将由一个网站 (Joomla) 调用,该网站将允许登录该网站的用户在日历活动中注册他们的电子邮件地址,这样他们就可以在活动临近时收到电子邮件通知。这些用户不知道底层的 Google 帐户。
所以我的第一个问题是,使用服务帐户身份验证是否正确?查看 Google 文档,它是满足非人工身份验证的唯一用例(因此服务器到服务器身份验证)。
第二个问题是我已经编写了一些代码来执行此操作,但是当我调用日历提要的执行方法时,我得到了 401/未经授权的响应,返回了以下错误。此代码取自 Google 示例。
我正在使用 Google Calendar API 的 v3-rev3-1.5.0-beta。我已经在帐户中打开了日历 API,并创建并下载了一个私钥,该私钥在下面的代码中使用。
我在 Eclipse 中本地调用下面的代码,而不是从 Web 服务器调用。
所以我做的第一个调用是取回一个凭证对象(Id 被 X 混淆了):
private static final HttpTransport HTTP_TRANSPORT = new NetHttpTransport();
private static final JsonFactory JSON_FACTORY = new JacksonFactory();
.
.
.
GoogleCredential credential = new GoogleCredential.Builder().setTransport(HTTP_TRANSPORT)
.setJsonFactory(JSON_FACTORY)
.setServiceAccountId("284XXXXXXXX@developer.gserviceaccount.com")
.setServiceAccountScopes(CalendarScopes.CALENDAR)
.setServiceAccountPrivateKeyFromP12File(new File("D:/3cd8XXXXXXXXXXXXXXXXXXXXXXXXXXXXXd635e-privatekey.p12"))
.build();
下一步是调用 Calendar API,如下所示(中间没有调用其他代码):
Calendar calendar = Calendar.builder(HTTP_TRANSPORT, JSON_FACTORY)
.setApplicationName("TestApp-Calendar/1.0").setHttpRequestInitializer(credential)
.build();
CalendarList feed = calendar.calendarList().list().execute();
调用 list().execute() 会导致以下错误:
com.google.api.client.googleapis.json.GoogleJsonResponseException: 401 Unauthorized { "code" : 401, "errors" : [ { "domain" : "global", "location" : "Authorization", "locationType" : " header", "message" : "需要登录", "reason" : "需要" } ], "message" : "需要登录" } 在 com.google.api.client.googleapis.json.GoogleJsonResponseException.from(GoogleJsonResponseException. java:159) 在 com.google.api.client.googleapis.json.GoogleJsonResponseException.execute(GoogleJsonResponseException.java:187) 在 com.google.api.client.googleapis.services.GoogleClient.executeUnparsed(GoogleClient.java:115)在 com.google.api.client.http.json。JsonHttpRequest.executeUnparsed(JsonHttpRequest.java:112) at com.google.api.services.calendar.Calendar$CalendarList$List.execute(Calendar.java:510) at uk.org.reigatepriorybowmen.Service.registerEmailForAllCalendarEvents(Service.java: 55) 在 uk.org.reigatepriorybowmen.Service.main(Service.java:74)
服务帐户设置如下:
那么,我做错了什么?!我花了几个小时在谷歌上搜索寻找解决方案,所以这是我最后的希望。
非常感谢您的帮助。
贾斯汀