Composio Strava 工具包实战:自定义 OAuth 凭证配置,排错 “Athlete limit exceeded“ 与私有活动缺失
2026/9/9 23:41:08 网站建设 项目流程

Composio Strava 工具包实战:自定义 OAuth 凭证配置,排错 "Athlete limit exceeded" 与私有活动缺失

【免费下载链接】composioComposio powers 1000+ toolkits, tool search, context management, authentication, and a sandboxed workbench to help you build AI agents that turn intent into action.项目地址: https://gitcode.com/GitHub_Trending/co/composio

本篇聚焦 Composio 仓库中 Strava 工具包的 FAQ 文档(docs/content/toolkits/faq/strava.md),覆盖三个生产高频问题:如何为 Strava 配置自定义 OAuth 凭证、为什么会出现Athlete limit exceededApplication.Status.Inactive错误、以及为什么读不到私有(Only Me)活动。读完后你可以直接用 SDK 代码完成「自有 Strava 开发者应用 → Composio auth config → 会话绑定」的完整链路,并能针对容量与 scope 问题给出可落地的处置方案。

Strava 工具包在 Composio 中的定位

从仓库生成的工具包目录数据 docs/public/data/toolkits.json 可以看到 Strava 工具包的基本盘:

  • slug 为strava,分类为fitness,描述为面向骑行者与跑者的社交健身网络;
  • 认证方式仅有OAUTH2一种(authSchemes: ["OAUTH2"]);
  • Composio 同时提供托管 OAuth 应用(composioManagedAuthSchemes: ["OAUTH2"]),即可以零凭证接入;
  • 共 36 个工具(toolCount: 36),当前版本20260721_00,覆盖活动详情/流数据/训练分区、运动员统计、路段探索、路线 GPX/TCX 导出等能力。

这意味着:Strava 连接必然走 OAuth2 授权流程,而该工具包的 FAQ 三个问题全部围绕「用哪个 OAuth 应用、应用有什么权限与容量」展开——这正是理解整篇文档的主线。

问题一:如何为 Strava 配置自定义 OAuth 凭证

FAQ 第一条指向官方 Strava OAuth 凭证创建指南(该指南在仓库知识库的外部来源索引 docs/kb/external-sources/auth-guides.json 中登记为 “How to create OAuth2 credentials for Strava”,canonical 页面为 composio.dev 的/auth/strava)。在仓库内,与其对应的可执行流程完整记录在 程序化 auth config 文档 与 托管应用 vs 自定义应用决策文档 中,二者组合起来就是 Strava 自定义凭证的完整操作路径。

1. 先在 Strava 开发者门户注册应用

custom-app-vs-managed-app文档的通用 OAuth 步骤:

  1. 在 Strava 开发者门户注册一个开发者应用,得到Client IDClient Secret
  2. 把 Composio 的回调地址加入应用的授权重定向 URI 白名单:
https://backend.composio.dev/api/v1/auth-apps/add
  1. 将 Client ID / Secret 提交给 Composio,落成一条 auth config。

2. 用 SDK 创建自定义 auth config

以下代码取自 程序化 auth config 文档 中use_custom_auth的 OAuth2 示例,只需把 toolkit 与凭证换成 Strava:

import os from composio import Composio composio = Composio() auth_config = composio.auth_configs.create( toolkit="strava", options={ "type": "use_custom_auth", "auth_scheme": "OAUTH2", "name": "Strava", "credentials": { "client_id": os.environ["STRAVA_CLIENT_ID"], "client_secret": os.environ["STRAVA_CLIENT_SECRET"], "oauth_redirect_uri": "https://backend.composio.dev/api/v1/auth-apps/add", }, }, ) print(auth_config.id) # ac_xxxxxxxx
import { Composio } from '@composio/core'; const composio = new Composio(); const authConfig = await composio.authConfigs.create('strava', { type: 'use_custom_auth', authScheme: 'OAUTH2', name: 'Strava', credentials: { client_id: process.env.STRAVA_CLIENT_ID!, client_secret: process.env.STRAVA_CLIENT_SECRET!, oauth_redirect_uri: 'https://backend.composio.dev/api/v1/auth-apps/add', }, }); console.log(authConfig.id); // ac_xxxxxxxx

关键参数说明(均来自上述文档原文):

参数说明
typeuse_custom_auth表示使用自有凭证;对照选项是use_composio_managed_auth(使用 Composio 托管应用,Strava 亦支持,见 toolkits.json 的composioManagedAuthSchemes
auth_schemeStrava 只支持OAUTH2
credentials.client_id/client_secret在 Strava 开发者门户注册应用后获得
credentials.oauth_redirect_uri文档明确指出:省略时默认使用 Composio 默认回调;仅当需要把回调路由经过自有域名(白标场景)时才显式设置
返回值ac_xxxxxxxx格式的 auth config ID,需自行保存,供会话引用

如果不确定某工具包的 OAuth2 方案需要哪些凭证字段,可以先让 SDK 查询再动态构造credentials

fields = composio.toolkits.get_auth_config_creation_fields( toolkit="strava", auth_scheme="OAUTH2", required_only=True, ) print(fields)
const fields = await composio.toolkits.getAuthConfigCreationFields('strava', 'OAUTH2', { requiredOnly: true, }); console.log(fields);

3. 把 auth config 绑定到会话

文档反复强调:只创建 auth config 并不会改变会话使用的凭证,必须在创建会话时按 toolkit 名传入该 ID:

session = composio.sessions.create( user_id="user_123", auth_configs={"strava": auth_config.id}, )
const session = await composio.create('user_123', { authConfigs: { strava: authConfig.id }, });

未列入auth_configs的工具包仍走 Composio 托管认证,因此可以「Strava 用自有应用、其余工具包用托管应用」按工具包粒度混用。对已用托管应用连接过的 Strava 账户,FAQ 给出的动作是通过新的自定义 auth config 重新连接(reconnect),让新凭证与 scope 生效——这一点在问题三中是排错的关键动作。

4. 什么场景下值得切到自定义应用

custom-app-vs-managed-app 文档 总结了通用决策条件,套用到 Strava 上:

  • 用户会看到授权同意页:生产环境希望显示你的应用名而非 “Composio”;
  • 需要自定义 scope:Composio 默认 scope 不满足需求(Strava 上最典型的诉求就是activity:read_all,见问题三);
  • 受共享配额限制:托管应用配额在所有用户间共享,自有应用独享配额与容量;
  • 托管应用附加限制:文档指出托管认证下轮询触发最小 15 分钟间隔,自有应用在不被工具包支持限制时可更短;
  • 需要白标或企业级端到端品牌展示。

反过来,如果只是在搭建原型、默认 scope 够用,托管应用就是零成本起点,无需注册任何应用。

问题二:为什么会出现 "Athlete limit exceeded" 或Application.Status.Inactive

FAQ 原文给出了明确的归因:当连接背后的 Strava OAuth 应用未被 Strava 完全批准/激活,或已达到其运动员(athlete)容量上限时,Strava 会拒绝授权或工具执行。具体表现分两种:

  • 使用托管 Strava OAuth时,授权阶段可能出现Athlete limit exceeded
  • 工具执行阶段可能出现 Strava 返回的403 响应,错误码Application.Status.Inactive

仓库知识库中与该问题同源的支持文章 docs/kb/source/toolkits/strava/public.md 进一步补充了两点实操判断:

  1. 容量是按开发者应用维度计的(connected-athlete capacity per developer application)。看到Athlete limit exceeded时,第一步是判断当前 auth config 用的是 Composio 托管凭证还是客户自有应用,不要想当然认为客户拥有托管应用;
  2. 具体容量数值只在应用所有者的 Strava API 设置页可见且可能变动,因此对外回答时不要引用未经核实的容量数字。

针对托管应用的批准与容量问题,FAQ 的立场是:官方正在与 Strava 推进托管应用的审批与扩容,但由于取决于 Strava 的审批流程,没有可承诺的时间点。因此处置方案是:

生产使用或需要专属容量时,创建自有 Strava OAuth 应用,配置为自定义 auth config(即问题一的流程),再让用户通过该配置重新连接账户。

即:错误出现在授权阶段还是执行阶段(403Application.Status.Inactive)只是症状位置不同,根因都指向「应用未激活」或「应用级容量用尽」,解法统一为切换到自有应用。

问题三:为什么读不到私有(Only Me)活动

FAQ 的归因是 scope 不足,仓库中的工具目录数据为其提供了逐项佐证。

托管 scope 集合与缺口

FAQ 原文:托管 Strava OAuth 当前的 scope 集合为readactivity:readprofile:read_all三项。

  • activity:read只能读取按 Strava 可见性规则对授权运动员可见的活动;
  • 私有(Only Me)活动必须持有activity:read_all
  • 当前托管集合不含activity:read_all,这是缺口的直接原因。

docs/public/data/toolkits.json 中 Strava 各工具的描述逐条印证了这两档 scope 的边界:

工具 slugscope 要求(原文摘译)
STRAVA_GET_ACTIVITYeveryone/followers 可见性活动需activity:readonly_me私有活动需activity:read_all,且活动必须属于授权运动员本人
STRAVA_GET_ACTIVITY_STREAMS需要activity:read;Only Me 私有活动需要activity:read_all
STRAVA_GET_ACTIVITY_ZONESSummit 功能;Everyone/Followers 可见性需activity:read,Only Me 需activity:read_all;缺 Summit 订阅时返回 402
STRAVA_GET_ATHLETE_ZONES需要profile:read_all
STRAVA_EXPORT_ROUTE_GPX/STRAVA_EXPORT_ROUTE_TCX私有路线需要read_allscope
STRAVA_CREATE_AN_ACTIVITY需要activity:write(当前托管集合同样没有,说明写操作必须自有应用)

解决方案

FAQ 给出的修复路径与问题一完全打通:

  1. 使用自有 Strava OAuth 应用,在注册/配置时把activity:read_all加入申请的 scope;
  2. 按「问题一」的流程创建toolkit="strava"的自定义 auth config;
  3. 重新连接该 Strava 账户——scope 是授权时授予的,只换配置不重新授权不会生效,重连后新 scope 才会被 Strava 授予并写入该连接的 token。

如果同时还需要activity:write等其余 scope,同一套自有应用流程即可覆盖;scope 覆盖范围与托管 vs 自有应用的通用决策见 托管应用 vs 自定义应用,scope 控制的高级用法可继续参考 控制 OAuth scope。

排查速查表

症状出现阶段根因处置
Athlete limit exceededOAuth 授权应用级运动员容量用尽(多为托管应用)建自有 Strava 应用 → 自定义 auth config → 重连账户
403Application.Status.Inactive工具执行应用未通过 Strava 完全批准/激活同上;托管应用的批准/扩容取决于 Strava,无确定时间表
私有活动缺失活动读取类工具缺少activity:read_all(托管集合仅read/activity:read/profile:read_all自有应用加配activity:read_all→ 自定义 auth config → 重连
私有路线 GPX/TCX 导出失败路线导出工具私有路线需要read_allscope同上,申请含activity:read_all的自有应用

延伸阅读(仓库内路径)

  • FAQ 原文:docs/content/toolkits/faq/strava.md
  • 程序化创建 auth config(含 Python/TypeScript 代码与字段查询 API):docs/content/docs/authentication/programmatic-auth-configs.mdx
  • 托管应用 vs 自定义应用的决策与 dashboard 配置步骤:docs/content/docs/authentication/custom-app-vs-managed-app.mdx
  • Strava 支持知识库文章(容量归属判断):docs/kb/source/toolkits/strava/public.md
  • Strava 工具包全量工具与 scope 要求数据源:docs/public/data/toolkits.json
  • 外部 OAuth 指南索引(含 Strava 指南登记信息):docs/kb/external-sources/auth-guides.json

【免费下载链接】composioComposio powers 1000+ toolkits, tool search, context management, authentication, and a sandboxed workbench to help you build AI agents that turn intent into action.项目地址: https://gitcode.com/GitHub_Trending/co/composio

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询