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

.NET Web应用集成Google Fit API及用户登录授权问题

解决Google Fit API结合ASP.NET Core Google认证的问题

核心结论

完全可以通过ASP.NET Core常规的Google认证流程获取Fit API的访问令牌,不需要使用GoogleWebAuthorizationBroker(该类适用于桌面/控制台应用)。你的问题主要出在Cloud Console配置遗漏、认证权限未声明这两个关键点上。


一、修正Cloud Console配置

  1. 确认客户端类型:你的OAuth 2.0客户端ID必须是Web应用类型,不能是桌面或其他类型。
  2. 匹配重定向URI:你设置的回调路径是/Home,必须在Cloud Console的「已授权的重定向URI」中添加对应地址(本地测试为https://localhost:端口号/Home,生产环境替换为实际域名),这是你之前跳转错误的核心原因。
  3. 启用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失败");
    }
}

四、常见问题说明

  1. 同意页不显示Fit权限:因为之前未在认证配置中添加Fit API的Scope,Google默认只请求基础用户信息权限,添加后同意页会自动列出所有申请的Fit权限。
  2. 为什么不用GoogleWebAuthorizationBroker:该类是为桌面/控制台应用设计的,会启动本地临时服务器处理回调,和ASP.NET Core的Web应用认证流程冲突,因此不适用。

内容的提问来源于stack exchange,提问作者HHMortada

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 12:01:12