Java 如何正确获取用户';使用服务帐户的日历事件?

Java 如何正确获取用户';使用服务帐户的日历事件?,java,google-calendar-api,google-api-java-client,Java,Google Calendar Api,Google Api Java Client,我正在尝试为域中的用户检索日历事件。我有服务帐户访问权限,但当我尝试获取特定用户事件时,会出现404错误。 以下是连接代码: NetHttpTransport httpTransport = GoogleNetHttpTransport.newTrustedTransport(); GoogleCredential credential = new GoogleCredential.Builder() .setTransport(httpTransport)

我正在尝试为域中的用户检索日历事件。我有服务帐户访问权限,但当我尝试获取特定用户事件时,会出现404错误。 以下是连接代码:

NetHttpTransport httpTransport = GoogleNetHttpTransport.newTrustedTransport();
    GoogleCredential credential = new GoogleCredential.Builder()
            .setTransport(httpTransport)
            .setJsonFactory(JSON_FACTORY)
            .setServiceAccountId(googleApiServiceAccountId)
            .setServiceAccountScopes(Collections.singleton(CalendarScopes.CALENDAR_READONLY))
            .setServiceAccountPrivateKey(SecurityUtils.loadPrivateKeyFromKeyStore(
                    SecurityUtils.getPkcs12KeyStore(),
                    getClass().getClassLoader().getResourceAsStream(googleApiPrivateKeyPath),
                    NOTASECRET, PRIVATEKEY, NOTASECRET))
            .build();

    calendarApi = new Calendar.Builder(httpTransport,
            JSON_FACTORY, credential).setApplicationName(getApplicactionName()).build();
事件列表方法:

public List<Event> getCalendarEventsForUserAndDates(String userEmail, Long dateFrom, Long dateTo) {
    try {
        String pageToken = null;
        List<Event> allEvents = Lists.newArrayList();
        do {
            ArrayMap<String, Object> parameters = new ArrayMap<String, Object>();
            parameters.add("xoauth_requestor_id", userEmail);
            Calendar.Events.List list = calendarApiBean.getCalendarApi()
                    .events().list("primary");
            list.setTimeMax(new DateTime(dateFrom, 0))
                    .setTimeMin(new DateTime(dateTo, 0))
                    .setUnknownKeys(parameters);
            Events events = list.setPageToken(pageToken)
                    .execute();
            List<? extends Event> items = events.getItems();
            if (items != null) {
                allEvents.addAll(items);
            }
            pageToken = events.getNextPageToken();
        } while (pageToken != null);
        return allEvents;
    } catch (IOException e) {
        logger.error("error while retriving calendar events for {} and dates {} {} ", userEmail, dateFrom, dateTo);
        logger.error("exception", e);
        return Collections.emptyList();
    }

}

谢谢您的帮助。

要解决此问题,我必须在域管理中将此服务帐户添加到授权API客户端。
客户端名称是服务帐户客户端ID,作用域是只读日历

这包括两个不同的部分

  • 创建服务帐户
  • 授予it访问所需范围的权限
  • 创建服务帐户:

  • 转到云页面以管理您的服务帐户: 左侧菜单->IAM和管理->服务帐户。或点击此链接:
  • 确保您以要使用的用户身份登录,并检查是否正确选择了组织
  • 使用Project Viewer角色创建一个新的服务帐户(您可以稍后更改),并在单击创建密钥时下载带有凭据的.json文件
  • 编辑服务帐户并启用G套件域范围的委派
  • 记下客户端ID(而不是密钥ID)
  • 授予它权限:

  • 请访问admin.google.com
  • 确保您以具有管理员权限的用户身份登录
  • 然后转到安全->设置->高级设置->管理API客户端访问
  • 在客户端名称中,填写您在上面复制的客户端ID(而不是密钥ID)
  • 填写您需要的范围并授权服务帐户。即:

    https://www.googleapis.com/auth/calendar.readonly,https://www.googleapis.com/auth/gmail.readonly
    
  • 我测试了我在源代码中链接的Python示例,可以确认这是正常的

    资料来源:

    +1但您能否详细说明一下所需的步骤。我还没有能够在(新的)中完成这项工作。这不是我做的。一些域管理员修复了这个问题。嗨@mihn,你能分享完整的代码吗?我在开发程序时遇到了麻烦,它可以使用服务帐户来获取用户的日历事件。我想知道我错过了什么。我想更正程序。谢谢。我相信@mihn指的是“OAuth:管理API客户端访问”,它需要G套件超级管理员访问权限。
    https://www.googleapis.com/auth/calendar.readonly,https://www.googleapis.com/auth/gmail.readonly