使用.NET库对接Google Calendar API:如何用已有Token生成Credentials
服务器端用已有Token创建Google Calendar凭据并插入事件
你已经走完授权码流程的前两步,拿到了AccessToken和RefreshToken,不用再用桌面端的GoogleWebAuthorizationBroker,直接通过以下方式构建服务器端可用的credentials:
步骤实现
首先确保安装NuGet包:Google.Apis.Calendar.v3 和 Google.Apis.Auth
1. 把已存的Token转成TokenResponse对象
先把你数据库里存的用户Token信息映射成Google SDK的TokenResponse:
var tokenResponse = new TokenResponse { AccessToken = "用户的AccessToken", RefreshToken = "用户的RefreshToken", ExpiresInSeconds = /* Token剩余过期秒数,或从过期时间计算 */, IssuedUtc = DateTime.UtcNow // 或者Token实际颁发的UTC时间 };
2. 创建授权流程和UserCredential
// 配置你的Google客户端密钥 var clientSecrets = new ClientSecrets { ClientId = "你的Google Client ID", ClientSecret = "你的Google Client Secret" }; // 授权范围要和用户授权时完全一致,比如日历事件读写 var scopes = new[] { CalendarService.Scope.CalendarEvents }; // 创建服务器端授权流程实例 var flow = new GoogleAuthorizationCodeFlow(new GoogleAuthorizationCodeFlow.Initializer { ClientSecrets = clientSecrets, Scopes = scopes, // 可选:如果需要持久化Token,这里可以用自定义的IDataStore实现(比如数据库) DataStore = new FileDataStore("CalendarTokenStore") }); // 用TokenResponse生成UserCredential var userId = "用户唯一标识(比如邮箱)"; // 和授权时用的用户标识一致 var credentials = new UserCredential(flow, userId, tokenResponse);
3. 处理Token过期并插入事件
// 检查Token是否过期,过期自动刷新 if (credentials.Token.IsExpired(SystemClock.Default)) { await credentials.RefreshTokenAsync(CancellationToken.None); // 刷新后记得把新的AccessToken、RefreshToken存回数据库,下次用最新的 } // 初始化Calendar服务 var service = new CalendarService(new BaseClientService.Initializer { HttpClientInitializer = credentials, ApplicationName = "你的Blazor应用名称" }); // 构建要插入的事件 var newEvent = new Event() { Summary = "Blazor应用同步的日程", Location = "线上会议", Start = new EventDateTime() { DateTime = DateTime.Parse("2024-06-01T14:00:00"), TimeZone = "Asia/Shanghai" }, End = new EventDateTime() { DateTime = DateTime.Parse("2024-06-01T15:00:00"), TimeZone = "Asia/Shanghai" } }; // 插入到用户的主日历 var request = service.Events.Insert(newEvent, "primary"); var createdEvent = await request.ExecuteAsync();
重要提醒
- Token更新要持久化:每次刷新Token后,必须把新的Token信息更新到你的存储(数据库)里,不然下次调用会用过期的Token。
- Scope要一致:授权流程的scopes必须和用户当初授权时的完全匹配,否则会触发权限不足的错误。
- 敏感信息保密:ClientSecret绝对不能暴露给前端,所有Token处理和API调用都要在Blazor服务器端执行。
内容的提问来源于stack exchange,提问作者Greg Gum
相关产品推荐
相关产品推荐

