【发布时间】:2019-07-20 01:53:48
【问题描述】:
致力于从后端在特定日历上创建 Google 日历活动。就像有人在 Web 应用程序中生成会议一样,它应该从后端添加到共享的谷歌日历中(使用 JAVA - Spring boot 运行)。
生成事件的用户必须是授权用户才能这样做。
我已按照此文档在 java 中进行初始设置。
我使用过的依赖项,
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