【问题标题】:Create Google Calendar Event from Java Backend from OAuth authenticated Users only仅通过 OAuth 身份验证的用户从 Java 后端创建 Google 日历事件
【发布时间】:2019-07-20 01:53:48
【问题描述】:

致力于从后端在特定日历上创建 Google 日历活动。就像有人在 Web 应用程序中生成会议一样,它应该从后端添加到共享的谷歌日历中(使用 JAVA - Spring boot 运行)。

生成事件的用户必须是授权用户才能这样做。

我已按照此文档在 java 中进行初始设置。

JAVA docs - initial setup

我使用过的依赖项,

compile 'com.google.api-client:google-api-client:1.23.0'
compile 'com.google.oauth-client:google-oauth-client-jetty:1.23.0'
compile 'com.google.apis:google-api-services-calendar:v3-rev305-1.23.0'

然后创建一个我已经尝试过的事件,

public String createCalendarEvent() throws GeneralSecurityException, IOException {

    String calendarId = "primary";

    // Build a new authorized API client service.
    final NetHttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport();
    Calendar service = new Calendar.Builder(HTTP_TRANSPORT, JSON_FACTORY, getCredentials(HTTP_TRANSPORT))
        .setApplicationName(APPLICATION_NAME)
        .build();

    Event event = new Event()
        .setSummary("Testing Event Creation 1")
        .setLocation("India")
        .setDescription("Testing Event Creation");


    EventDateTime start = new EventDateTime()
        .setDate(new DateTime("2019-02-26"));
    event.setStart(start);

    EventDateTime end = new EventDateTime()
        .setDate(new DateTime("2019-02-28"));
    event.setEnd(end);

    event = service.events().insert(calendarId, event).execute();
    log.debug("Event is created and HTML link is: " + event.getHtmlLink());
    return event.getHtmlLink();
}

getCredential() 方法负责授权如下:

private static Credential getCredentials(final NetHttpTransport HTTP_TRANSPORT) throws IOException {
    // Load client secrets.
    InputStream in = CalendarEventService.class.getClassLoader().getResourceAsStream(CREDENTIALS_FILE_PATH);
    GoogleClientSecrets clientSecrets = GoogleClientSecrets.load(JSON_FACTORY, new InputStreamReader(in));

    // Build flow and trigger user authorization request.
    GoogleAuthorizationCodeFlow flow = new GoogleAuthorizationCodeFlow.Builder(
        HTTP_TRANSPORT, JSON_FACTORY, clientSecrets, SCOPES)
        .setDataStoreFactory(new FileDataStoreFactory(new File(TOKENS_DIRECTORY_PATH)))
        .setAccessType("offline")
        .setApprovalPrompt("force")
        .build();
    LocalServerReceiver receiver = new LocalServerReceiver.Builder().setPort(8888).build();
    Credential credential = new AuthorizationCodeInstalledApp(flow, receiver).authorize("user");
    return credential;
}

所需的 OAuth ClientID 和 ClientSecret 位于 CREDENTIALS_FILE_PATH。在运行时,它会在 TOKENS_DIRECTORY_PATH 中生成 AUTH_TOKEN 并在日历中创建一个事件。

如果用户更改,现在后续执行将毫无问题地执行。

我需要由当前登录的用户(应检查 OAuth)和来自后端 as this one 的用户在日历中创建事件。

【问题讨论】:

  • 您能否描述一下您当前解决方案的问题?您现在拥有的代码似乎是正确的。
  • @DaImTo 目前它在控制台中显示授权 URL,我必须单独打开才能授予访问权限。不知道如何将其传递给前端以获取访问权限?我想允许来自特定域的用户授予此功能的访问权限。
  • @DaImTo 当我将构建放在服务器上时,它会要求每个用户访问还是只要求一次(第一个)?因为目前它正在将令牌存储在一个位置。它会检查新用户还是会使用旧用户?

标签: java spring-boot google-calendar-api google-oauth google-api-java-client


【解决方案1】:

未经同意的服务器到服务器通信

您需要了解,私人用户数据始终要求您拥有访问权限。未经用户许可,您无法访问用户帐户。 Oauth2 为我们作为开发人员提供了一种请求用户同意访问其数据的方式。没有办法让您始终必须获得用户的许可才能访问他们的数据。

现在,如果您有 gsuite 帐户,您可以使用服务帐户并设置域范围的委派,以允许服务帐户访问域中的所有用户,然后它将能够代表用户执行操作,而无需必须提示任何人。

如果您只访问您个人可以控制的单个帐户,那么您还可以使用服务帐户并与服务帐户共享日历,然后服务帐户将有权访问该帐户并能够执行操作在它上面。

凭证存储

new FileDataStoreFactory(new File(TOKENS_DIRECTORY_PATH)

表示凭据的存储位置"user" 是一个字符串,表示您为其存储凭据的用户。

【讨论】:

  • 好的。感谢您为我清理一些东西,因为我是新手。
  • Oauth 很难。理解细节需要时间。
  • 有一件事想知道,这是第一次,它要求通过回复 URL 来打开访问权限,但是我在后端执行窗口中得到了这个 URL。有没有办法将它发送到前端?或者我在某个地方弄错了..请清除我的疑问。
  • 用 java 我不知道对不起。我主要使用 C# 客户端库,它们非常接近,但我的 Java 技能充其量是有限的。
猜你喜欢
  • 2012-05-29
  • 2021-09-29
  • 1970-01-01
  • 2014-12-25
  • 2017-10-29
  • 2016-09-11
  • 2018-11-20
  • 1970-01-01
  • 2018-06-07
相关资源
最近更新 更多