我正在开展一个项目,我必须使用REST访问一组Google日历并使用Java。
该程序位于私人非Google服务器上,定期(通过cron作业)连接到Google帐户,获取与该帐户关联的日历列表,获取每个日历的上个月的事件,并返回XML包含所有信息的文件。该程序应该能够在没有任何用户输入的情况下执行和访问日历。目前,该项目指定只读取日历,而不是修改日历(因此只会进行GET / LIST调用)。
我查看了Google文档并使用客户端库查看了示例代码,并且在访问日历API之前,几乎所有给出的示例都需要OAuth 2.0用户同意。甚至REST API文档页面也要求您激活OAuth 2.0以返回所请求的信息(否则返回HTTP 40X错误代码和包含错误状态和消息的JSON文件)。
我如何连接到Google Calendar REST API以获取我需要的信息,通过REST调用完成所有操作,并且在执行时无需用户同意?
或者我是否过于复杂,只需要在Google云端控制台的Resgistered Apps部分找到“服务器密钥”? 或者我是否要求同时使用OAuth和开发人员密钥? (我发现有人在标题下提到它:Google Calendar API v3硬编码凭据;然而,问题和解决方案是针对PHP的,我不知道Java中是否存在类似的东西。)< / p>
我希望我已经提供了足够的信息来说明我正在寻找什么,而且到目前为止还没有涵盖这个问题。我做了研究,并没有找到足够接近我所寻找的东西。
我无法发布超过2个链接(缺乏声誉),但确实查看了Google Calendar v3 REST API,以及指定创建JWT的页面。
答案 0 :(得分:10)
如果您只需要访问一组特定的日历,我会创建一个服务帐户并与该帐户共享必要的日历。
这样做:
然后您应该能够使用以下代码:
import com.google.api.client.googleapis.auth.oauth2.GoogleCredential;
import com.google.api.client.json.gson.GsonFactory;
import java.io.File;
import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport;
import java.util.Arrays;
import com.google.api.services.calendar.Calendar;
GoogleCredential credentials = new GoogleCredential.Builder().setTransport(GoogleNetHttpTransport.newTrustedTransport())
.setJsonFactory(new GsonFactory())
.setServiceAccountId("<service account email address>@developer.gserviceaccount.com")
.setServiceAccountScopes(Arrays.asList("https://www.googleapis.com/auth/calendar.readonly"))
.setServiceAccountPrivateKeyFromP12File(new File("<private key for service account in P12 format>-privatekey.p12"))
.build();
Calendar client = new Calendar.Builder(GoogleNetHttpTransport.newTrustedTransport(), new GsonFactory(), credentials).build();
client.<do calendar stuff>.execute();
如果您是域管理员,需要在未经各个用户同意的情况下访问属于您域名的所有Google Apps帐户的日历,而不是上面的第4步:
您现在应该能够编写如下代码:
import com.google.api.client.googleapis.auth.oauth2.GoogleCredential;
import com.google.api.client.json.gson.GsonFactory;
import java.io.File;
import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport;
import java.util.Arrays;
import com.google.api.services.calendar.Calendar;
GoogleCredential credentials = new GoogleCredential.Builder().setTransport(GoogleNetHttpTransport.newTrustedTransport())
.setJsonFactory(new GsonFactory())
.setServiceAccountId("<service account email address>@developer.gserviceaccount.com")
.setServiceAccountScopes(Arrays.asList("https://www.googleapis.com/auth/calendar"))
.setServiceAccountPrivateKeyFromP12File(new File("<private key for service account in P12 format>-privatekey.p12"))
.setServiceAccountUser("<domain user whose data you need>@yourdomain.com")
.build();
Calendar client = new Calendar.Builder(GoogleNetHttpTransport.newTrustedTransport(), new GsonFactory(), credentials).build();
client.<do calendar stuff as that user>()
答案 1 :(得分:2)
除了@aeijdenberg的答案中提到的步骤外,服务帐户现在还需要通过通过CalendarList.insert将共享日历添加到其日历列表中来显式接受共享日历。参见:
服务帐户不再接受自动共享的日历[148804709] https://issuetracker.google.com/issues/148804709