会议插件开发:如何通过OAuth回调触发Google Calendar相关操作
解决方案
1. 调整authCallback逻辑,不要在授权回调中处理会议生成
createConference的返回值是唯一能让Google Calendar前端识别会议数据的入口,你在回调中单独调用dataBuilder.build()没有绑定上下文,不会被Calendar接收,完全无效。
authCallback只需要完成OAuth2凭据存储,同时添加通知父窗口授权完成的逻辑即可,示例代码:
function authCallback(request) { const oauth2Service = getOAuth2Service(); // 你自己定义的OAuth2实例获取方法 const isAuthSuccess = oauth2Service.handleCallback(request); if (isAuthSuccess) { return HtmlService.createHtmlOutput(` <p>授权成功!窗口即将关闭</p> <script> // 通知父页面授权完成,自动关闭当前窗口 window.opener.postMessage({ action: 'CALENDAR_CONFERENCE_AUTH_SUCCESS' }, '*'); setTimeout(() => window.close(), 1000); </script> `); } return HtmlService.createHtmlOutput('<p>授权失败,请关闭窗口后重试</p>'); }
2. 确保createConference逻辑正确
createConference只需要在每次被调用时先校验授权状态,未授权就抛出带跳转链接的AUTH错误,已授权就直接返回生成好的ConferenceData对象即可,Google Calendar前端会自动处理后续的展示逻辑:
function createConference(e) { const oauth2Service = getOAuth2Service(); // 校验授权状态 if (!oauth2Service.hasAccess()) { const authUrl = oauth2Service.getAuthorizationUrl(); throw ConferenceDataService.newConferenceError() .setConferenceErrorType(ConferenceDataService.ConferenceErrorType.AUTHENTICATION) .setAuthenticationUrl(authUrl) .build(); } // 已授权的情况,正常生成第三方会议数据 const conferenceData = create3rdPartyConference(e); // 你自己的会议生成逻辑,返回databuilder.build()的结果 return conferenceData; }
3. 流程说明
- 用户第一次触发添加会议时,
createConference检测到未授权,抛出AUTH错误,Calendar前端自动展示登录按钮 - 用户点击按钮完成授权,回调页面通知父窗口后自动关闭
- 此时Calendar前端会自动重试调用
createConference,你服务端已经存储了有效token,直接返回会议数据,前端自动替换登录按钮为会议入口,不需要你主动修改未创建的事件,此时传入的eventId为临时ID,调用Calendar API查询自然会返回404,不需要处理这个情况 - 等用户点击保存事件时,Calendar会自动把会议数据和事件绑定存储,此时eventId才会正式生效。
内容的提问来源于stack exchange,提问作者Olamilekan Ibrahim
相关产品推荐
相关产品推荐

