Java Spring Boot应用集成Google Calendar API 单次授权咨询
单授权集成Google Calendar到Spring Boot应用
完全可以通过一次授权完成Google账号与你的应用集成,核心是利用OAuth2授权码流程获取Refresh Token,后续无需用户重复授权,直接用Refresh Token刷新Access Token即可调用Google Calendar API。以下是具体实现步骤:
1. 准备Google Cloud配置
- 在Google Cloud Console创建项目,启用Google Calendar API
- 创建OAuth2客户端ID,选择"Web应用"类型,配置重定向URI(例如
http://localhost:8080/login/oauth2/code/google,生产环境替换为实际域名) - 下载客户端配置文件(
credentials.json),放置到项目src/main/resources目录
2. 添加依赖
在pom.xml中引入Spring OAuth2客户端和Google Calendar API依赖:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-oauth2-client</artifactId> </dependency> <dependency> <groupId>com.google.apis</groupId> <artifactId>google-api-services-calendar</artifactId> <version>v3-rev20240209-2.0.0</version> </dependency>
3. 修改Spring Security配置
结合你现有表单登录逻辑,添加OAuth2授权支持,修改configure(HttpSecurity http)方法:
@Override protected void configure(HttpSecurity http) throws Exception { http.authorizeRequests() .antMatchers("/error.xhtml", "/error-404.xhtml", "/login", "/oauth2/authorization/google").permitAll() .anyRequest().authenticated() .accessDeniedPage("/accessDenied.xhtml"); // 保留原有表单登录配置 http.formLogin() .loginPage("/login") .failureUrl("/login?error=1") .defaultSuccessUrl("/dashboard", true); // 添加Google OAuth2授权配置 http.oauth2Login() .authorizationEndpoint() .baseUri("/oauth2/authorization/google") .and() .redirectionEndpoint() .baseUri("/login/oauth2/code/google") .and() .userInfoEndpoint() .userService(customOAuth2UserService); // 自定义服务处理授权后的凭证存储 // 保留原有登出配置 http.logout() .logoutSuccessUrl("/login") .invalidateHttpSession(true) .deleteCookies("JSESSIONID"); http.csrf().disable(); // 建议生产环境按需启用,暂时保留原有配置 }
4. 自定义OAuth2服务存储凭证
创建CustomOAuth2UserService,在用户授权成功后,将Refresh Token关联到当前登录的应用用户(需在用户表中新增字段存储google_refresh_token、google_token_expiry等信息):
@Service public class CustomOAuth2UserService implements OAuth2UserService<OAuth2UserRequest, OAuth2User> { @Autowired private UserRepository userRepository; // 你的用户数据访问层 @Override public OAuth2User loadUser(OAuth2UserRequest userRequest) throws OAuth2AuthenticationException { OAuth2User delegate = new DefaultOAuth2UserService().loadUser(userRequest); // 获取当前登录的应用用户 AppUser currentUser = (AppUser) SecurityContextHolder.getContext().getAuthentication().getPrincipal(); // 提取并存储OAuth2凭证 OAuth2RefreshToken refreshToken = userRequest.getRefreshToken(); OAuth2AccessToken accessToken = userRequest.getAccessToken(); currentUser.setGoogleRefreshToken(refreshToken.getTokenValue()); currentUser.setGoogleTokenExpiry(accessToken.getExpiresAt()); userRepository.save(currentUser); return delegate; } }
5. 实现Calendar API调用逻辑
创建服务类,利用存储的Refresh Token自动刷新Access Token,调用Google Calendar API:
@Service public class GoogleCalendarService { @Value("${spring.security.oauth2.client.registration.google.client-id}") private String clientId; @Value("${spring.security.oauth2.client.registration.google.client-secret}") private String clientSecret; @Autowired private UserRepository userRepository; public Calendar getCalendarService(AppUser user) throws IOException { GoogleCredential credential = new GoogleCredential.Builder() .setClientSecrets(clientId, clientSecret) .build() .setRefreshToken(user.getGoogleRefreshToken()); // 自动刷新Access Token credential.refreshToken(); return new Calendar.Builder( GoogleNetHttpTransport.newTrustedTransport(), JacksonFactory.getDefaultInstance(), credential) .setApplicationName("你的应用名称") .build(); } // 示例:创建日历事件 public Event createCalendarEvent(AppUser user, Event event) throws IOException { Calendar service = getCalendarService(user); return service.events().insert("primary", event).execute(); } }
6. 前端授权入口
在应用的"设置"页面添加一个"连接Google日历"按钮,指向授权地址/oauth2/authorization/google,用户点击后跳转到Google授权页面,完成授权后自动返回应用,凭证即存储完成,后续可直接调用Calendar API操作日程。
注意事项
- 确保Google Cloud控制台的重定向URI与应用配置完全一致
- 存储Refresh Token时需加密,避免敏感信息泄露
- 需为OAuth2请求申请合适的Calendar API权限(例如
https://www.googleapis.com/auth/calendar.events用于创建事件),遵循最小权限原则 - 处理Refresh Token过期场景(虽有效期长,但仍需提供重新授权入口)
内容的提问来源于stack exchange,提问作者Rekillme Re
相关产品推荐
相关产品推荐

