.NET Web应用集成Google Fit API及用户登录授权问题
解决Google Fit API结合ASP.NET Core Google认证的问题
核心结论
完全可以通过ASP.NET Core常规的Google认证流程获取Fit API的访问令牌,不需要使用GoogleWebAuthorizationBroker(该类适用于桌面/控制台应用)。你的问题主要出在Cloud Console配置遗漏、认证权限未声明这两个关键点上。
一、修正Cloud Console配置
- 确认客户端类型:你的OAuth 2.0客户端ID必须是Web应用类型,不能是桌面或其他类型。
- 匹配重定向URI:你设置的回调路径是
/Home,必须在Cloud Console的「已授权的重定向URI」中添加对应地址(本地测试为https://localhost:端口号/Home,生产环境替换为实际域名),这是你之前跳转错误的核心原因。 - 启用Fit API:在Cloud Console的API库中找到「Google Fitness API」并启用,否则调用API会返回权限错误。
二、完善ASP.NET Core Google认证配置
你之前的代码未声明Fit API的权限范围,导致同意页不显示相关权限。修改认证配置如下:
builder.Services.AddAuthentication().AddGoogle(options => { IConfigurationSection auth = builder.Configuration.GetSection("Authentication:Google"); options.ClientId = auth["ClientId"]; options.ClientSecret = auth["ClientSecret"]; options.CallbackPath = "/Home"; // 必须和Cloud Console中配置的重定向URI一致 // 添加Fit API所需的权限范围 options.Scope.Add("https://www.googleapis.com/auth/fitness.activity.read"); options.Scope.Add("https://www.googleapis.com/auth/fitness.activity.write"); options.Scope.Add("https://www.googleapis.com/auth/fitness.sleep.read"); options.Scope.Add("https://www.googleapis.com/auth/fitness.sleep.write"); // 强制弹出同意页,确保用户明确授权权限 options.AuthorizationEndpoint += "?prompt=consent"; // 开启离线访问,保存刷新令牌用于后续静默续期 options.AccessType = "offline"; options.SaveTokens = true; });
三、获取令牌并调用Fit API
用户登录后,可从HttpContext中直接获取访问令牌,再调用Fit API:
public async Task<IActionResult> GetFitSessions() { var authResult = await HttpContext.AuthenticateAsync(); if (!authResult.Succeeded) { return Challenge(); // 未登录则触发Google登录流程 } // 从认证信息中提取访问令牌 var accessToken = authResult.Properties.GetTokenValue("access_token"); // 调用Fit API using var httpClient = new HttpClient(); httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", accessToken); var response = await httpClient.GetAsync("https://www.googleapis.com/fitness/v1/users/me/sessions"); if (response.IsSuccessStatusCode) { var sessionData = await response.Content.ReadAsStringAsync(); return Ok(sessionData); } else { // 处理令牌过期:可使用刷新令牌获取新的访问令牌 var refreshToken = authResult.Properties.GetTokenValue("refresh_token"); // 此处可添加刷新令牌的逻辑(调用Google令牌端点获取新access_token) return BadRequest("调用Fit API失败"); } }
四、常见问题说明
- 同意页不显示Fit权限:因为之前未在认证配置中添加Fit API的
Scope,Google默认只请求基础用户信息权限,添加后同意页会自动列出所有申请的Fit权限。 - 为什么不用GoogleWebAuthorizationBroker:该类是为桌面/控制台应用设计的,会启动本地临时服务器处理回调,和ASP.NET Core的Web应用认证流程冲突,因此不适用。
内容的提问来源于stack exchange,提问作者HHMortada
相关产品推荐
相关产品推荐

