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

如何实现用户Strava账户与ASP.NET Core MVC健身网站的关联?

嘿,我来帮你把Strava OAuth授权的后续流程彻底理清楚——其实这就是标准的OAuth2授权码流程,只是Strava有自己的细节要求,我一步步给你拆解:

1. 用户授权后,Strava跳转回你的回调地址

当用户在Strava的授权页面点击“授权”后,Strava会自动跳转到你在请求授权时指定的redirect_uri,并且在URL里带上两个关键参数:

  • code:这是临时授权码,只能使用一次,有效期很短(大概10分钟)
  • scope:用户实际授权的权限范围(和你请求时的scope一致,除非用户修改了)

举个例子,跳转后的地址会类似这样:
http://localhost:61488?code=abc123xyz&scope=read,activity:read_all

在ASP.NET Core MVC里,你可以直接在对应的控制器Action里获取这个code参数,比如:

public async Task<IActionResult> StravaCallback(string code, string scope)
{
    // 后续逻辑写在这里
}
2. 用授权码兑换访问令牌和刷新令牌

拿到code后,你需要在服务器端向Strava的令牌端点发送POST请求,兑换成可以实际调用API的access_token和用来续期的refresh_token。

Strava的令牌端点是https://www.strava.com/oauth/token,需要携带以下参数:

  • client_id:你的Strava应用ID(就是授权请求里的那个)
  • client_secret:你的Strava应用密钥(在开发者后台获取,一定要保密!)
  • code:刚才拿到的临时授权码
  • grant_type:固定值authorization_code

ASP.NET Core里的示例代码(用HttpClient):

var client = new HttpClient();
var requestContent = new FormUrlEncodedContent(new Dictionary<string, string>
{
    ["client_id"] = "你的ClientID",
    ["client_secret"] = "你的ClientSecret",
    ["code"] = code,
    ["grant_type"] = "authorization_code"
});

var response = await client.PostAsync("https://www.strava.com/oauth/token", requestContent);
var tokenData = await response.Content.ReadFromJsonAsync<StravaTokenResponse>();

// 定义一个模型来接收返回的令牌数据
public class StravaTokenResponse
{
    public string AccessToken { get; set; }
    public string RefreshToken { get; set; }
    public int ExpiresAt { get; set; } // 令牌过期的Unix时间戳
    public string TokenType { get; set; }
    // 其他返回字段按需添加
}
3. 存储令牌并调用Strava API

拿到access_token和refresh_token后,你需要把它们和当前网站的用户账户关联存储起来(比如存在数据库里)。

之后调用Strava API时,只需要把access_token放在请求头的Authorization字段里,格式是Bearer {access_token}。比如获取当前用户信息的请求:

var apiClient = new HttpClient();
apiClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", tokenData.AccessToken);

var userResponse = await apiClient.GetAsync("https://www.strava.com/api/v3/athlete");
var userData = await userResponse.Content.ReadFromJsonAsync<StravaAthlete>();

// 定义用户信息模型
public class StravaAthlete
{
    public long Id { get; set; }
    public string Firstname { get; set; }
    public string Lastname { get; set; }
    // 其他字段按需添加
}
4. 处理令牌过期

Strava的access_token有效期只有6小时,过期后你需要用之前存储的refresh_token来兑换新的access_token,不需要再次让用户授权。

请求方式还是POST到同一个令牌端点,参数换成:

  • client_id:你的应用ID
  • client_secret:你的应用密钥
  • refresh_token:之前存储的刷新令牌
  • grant_type:固定值refresh_token

示例代码:

var refreshRequest = new FormUrlEncodedContent(new Dictionary<string, string>
{
    ["client_id"] = "你的ClientID",
    ["client_secret"] = "你的ClientSecret",
    ["refresh_token"] = storedRefreshToken,
    ["grant_type"] = "refresh_token"
});

var refreshResponse = await client.PostAsync("https://www.strava.com/oauth/token", refreshRequest);
var newTokenData = await refreshResponse.Content.ReadFromJsonAsync<StravaTokenResponse>();

// 更新数据库里的access_token和refresh_token

几个关键注意事项

  • 回调地址必须完全匹配:你在授权请求里的redirect_uri,必须和Strava开发者后台里配置的地址完全一致(包括HTTP/HTTPS、端口、路径,不能有丝毫差异),否则Strava会拒绝跳转。
  • client_secret绝对不能暴露:这个密钥只能在服务器端使用,绝对不能写在前端代码里,也不能通过任何方式返回给客户端。
  • 提前确认权限范围:在发起授权请求时,要明确带上你需要的scope参数(比如scope=activity:read_all用来读取用户的活动数据),否则后续调用API会提示权限不足。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:56:27