You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 03:23:20