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 exceeded与Application.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 步骤:
- 在 Strava 开发者门户注册一个开发者应用,得到Client ID与Client Secret;
- 把 Composio 的回调地址加入应用的授权重定向 URI 白名单:
https://backend.composio.dev/api/v1/auth-apps/add- 将 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_xxxxxxxximport { 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关键参数说明(均来自上述文档原文):
| 参数 | 说明 |
|---|---|
type | use_custom_auth表示使用自有凭证;对照选项是use_composio_managed_auth(使用 Composio 托管应用,Strava 亦支持,见 toolkits.json 的composioManagedAuthSchemes) |
auth_scheme | Strava 只支持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 进一步补充了两点实操判断:
- 容量是按开发者应用维度计的(connected-athlete capacity per developer application)。看到
Athlete limit exceeded时,第一步是判断当前 auth config 用的是 Composio 托管凭证还是客户自有应用,不要想当然认为客户拥有托管应用; - 具体容量数值只在应用所有者的 Strava API 设置页可见且可能变动,因此对外回答时不要引用未经核实的容量数字。
针对托管应用的批准与容量问题,FAQ 的立场是:官方正在与 Strava 推进托管应用的审批与扩容,但由于取决于 Strava 的审批流程,没有可承诺的时间点。因此处置方案是:
生产使用或需要专属容量时,创建自有 Strava OAuth 应用,配置为自定义 auth config(即问题一的流程),再让用户通过该配置重新连接账户。
即:错误出现在授权阶段还是执行阶段(403Application.Status.Inactive)只是症状位置不同,根因都指向「应用未激活」或「应用级容量用尽」,解法统一为切换到自有应用。
问题三:为什么读不到私有(Only Me)活动
FAQ 的归因是 scope 不足,仓库中的工具目录数据为其提供了逐项佐证。
托管 scope 集合与缺口
FAQ 原文:托管 Strava OAuth 当前的 scope 集合为read、activity:read、profile:read_all三项。
activity:read只能读取按 Strava 可见性规则对授权运动员可见的活动;- 私有(Only Me)活动必须持有
activity:read_all; - 当前托管集合不含
activity:read_all,这是缺口的直接原因。
docs/public/data/toolkits.json 中 Strava 各工具的描述逐条印证了这两档 scope 的边界:
| 工具 slug | scope 要求(原文摘译) |
|---|---|
STRAVA_GET_ACTIVITY | everyone/followers 可见性活动需activity:read;only_me私有活动需activity:read_all,且活动必须属于授权运动员本人 |
STRAVA_GET_ACTIVITY_STREAMS | 需要activity:read;Only Me 私有活动需要activity:read_all |
STRAVA_GET_ACTIVITY_ZONES | Summit 功能;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 给出的修复路径与问题一完全打通:
- 使用自有 Strava OAuth 应用,在注册/配置时把
activity:read_all加入申请的 scope; - 按「问题一」的流程创建
toolkit="strava"的自定义 auth config; - 重新连接该 Strava 账户——scope 是授权时授予的,只换配置不重新授权不会生效,重连后新 scope 才会被 Strava 授予并写入该连接的 token。
如果同时还需要activity:write等其余 scope,同一套自有应用流程即可覆盖;scope 覆盖范围与托管 vs 自有应用的通用决策见 托管应用 vs 自定义应用,scope 控制的高级用法可继续参考 控制 OAuth scope。
排查速查表
| 症状 | 出现阶段 | 根因 | 处置 |
|---|---|---|---|
Athlete limit exceeded | OAuth 授权 | 应用级运动员容量用尽(多为托管应用) | 建自有 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),仅供参考