ASP.NET Core下Google Calendar授权实现示例咨询
ASP.NET Core下Google Calendar授权实现示例咨询
嗨,我完全懂你的困惑!你提到的那篇官方文档确实重点是把Google登录集成到你的ASP.NET Core应用里,让用户用Google账号登录系统,但这和你要的仅授权访问Google Calendar数据不是一回事。下面给你梳理具体的实现思路和示例,帮你搞定Calendar集成:
首先,你需要用到Google官方的.NET客户端库,先在项目里安装这两个NuGet包:Google.Apis.Calendar.v3 和 Google.Apis.Auth.AspNetCore3,它们能帮你处理授权逻辑和Calendar API的调用。
接下来分步骤操作:
1. 配置Google Cloud平台凭据
- 先去Google Cloud控制台创建一个项目,找到并启用「Google Calendar API」
- 然后创建「OAuth 2.0 客户端ID」,应用类型选「Web应用」,配置好授权回调地址(比如你的Core应用里的
/signin-google,这是库默认的回调路径,也可以自定义) - 下载生成的
credentials.json文件,放到项目根目录,设置「复制到输出目录」为「如果较新则复制」
2. 在ASP.NET Core中配置授权服务
在Program.cs里添加Google授权配置,注意这里我们不是用来做应用登录,而是为了获取访问Calendar的令牌:
builder.Services.AddAuthentication(options => { // 不需要设置默认认证方案,我们仅用Google OAuth获取令牌 }) .AddGoogle(options => { var credentials = GoogleClientSecrets.FromFile("credentials.json").Secrets; options.ClientId = credentials.ClientId; options.ClientSecret = credentials.ClientSecret; // 指定要请求的Calendar API权限,按需选择 options.Scope.Add(CalendarService.Scope.CalendarReadonly); // 若需自定义回调路径可取消注释 // options.CallbackPath = "/auth-google-callback"; });
3. 实现授权流程和Calendar数据获取
你可以创建一个控制器来处理授权请求和数据获取:
public class GoogleCalendarController : Controller { private readonly IGoogleAuthProvider _authProvider; public GoogleCalendarController(IGoogleAuthProvider authProvider) { _authProvider = authProvider; } // 发起授权请求 public IActionResult Authorize() { var redirectUrl = Url.Action("Callback", "GoogleCalendar"); var properties = _authProvider.CreateAuthProperties(redirectUrl); return Challenge(properties, GoogleDefaults.AuthenticationScheme); } // 授权回调,获取令牌并调用Calendar API public async Task<IActionResult> Callback() { var authResult = await HttpContext.AuthenticateAsync(GoogleDefaults.AuthenticationScheme); if (!authResult.Succeeded) { return BadRequest("授权失败,请重试"); } // 获取访问令牌 var accessToken = authResult.Properties.GetTokenValue("access_token"); // 创建Calendar服务实例 var service = new CalendarService(new BaseClientService.Initializer { HttpClientInitializer = new Google.Apis.Auth.OAuth2.UserCredential( new GoogleAuthorizationCodeFlow( new GoogleAuthorizationCodeFlow.Initializer { ClientSecrets = new ClientSecrets { ClientId = "你的客户端ID", ClientSecret = "你的客户端密钥" } }), "用户标识", accessToken) }); // 调用Calendar API获取日历列表示例 var calendarList = await service.CalendarList.List().ExecuteAsync(); return View(calendarList.Items); } }
一些关键注意事项
- 如果需要长期访问用户的Calendar数据,记得请求
offline_access权限,这样能获取刷新令牌,在访问令牌过期时自动刷新 - 权限范围要根据需求选择:
CalendarService.Scope.Calendar是读写权限,CalendarReadonly是只读权限 - 测试时要确保Google Cloud控制台里的授权回调地址和应用里的完全一致,否则会出现授权失败的错误
这样就能实现仅授权访问Google Calendar数据,而不是把Google登录作为应用的登录方式啦~
备注:内容来源于stack exchange,提问作者Craig
相关产品推荐
相关产品推荐

