Fast-F1 F1TV 账户认证完全指南:订阅鉴权流程、CLI 工具与底层实现原理
2026/9/17 13:42:04 网站建设 项目流程

Fast-F1 F1TV 账户认证完全指南:订阅鉴权流程、CLI 工具与底层实现原理

【免费下载链接】Fast-F1FastF1 is a python package for accessing and analyzing Formula 1 results, schedules, timing data and telemetry项目地址: https://gitcode.com/GitHub_Trending/fa/Fast-F1

本指南围绕 Fast-F1 的 F1TV 账户认证功能展开,系统讲解何时需要认证、认证的完整工作流程、命令行管理工具的使用方法,以及底层基于 JWT 与本地回调服务器的实现机制。读完本文,你将掌握 F1TV 订阅认证的启用、查看与清除操作,并能理解 Live Timing 客户端鉴权的真实调用链。

F1TV 认证的使用场景:只有 Live Timing 需要

Fast-F1(fastf1/init.py)是一款用于获取和分析 F1 成绩、赛程、计时数据与遥测数据的 Python 包。根据官方文档 accounts_auth.rst 的说明:

  • 需要认证的场景:使用 Live Timing 客户端(:ref:livetiming``)实时录制比赛期间数据时,需要有效的 F1TV Access / Pro / Premium 订阅;
  • 无需认证的场景:会话结束后的所有数据(成绩、遥测、排位结果等)均可直接访问,认证与否不影响历史数据加载。

这一设计在 v3.7.0 更新日志 中有明确交代:由于 Formula 1 官方逐步淘汰了旧端点,新的实时计时端点不再允许未认证访问,因此 Fast-F1 在 v3.7.0 起为 Live Timing 客户端加入了订阅认证支持;而对绝大多数只加载赛后数据的用户,该改动没有任何影响。

当 Fast-F1 遇到需要认证的功能时,如果检测到你尚未完成认证,它会自动弹出认证引导流程,无需手动预先配置。

认证工作流:从检测到令牌落盘的四步流程

官方文档 accounts_auth.rst 将认证过程概括为以下四个步骤:

  1. 检查现有有效认证令牌:优先复用本地已存储的令牌,避免重复登录;
  2. 提供登录 URL:若无有效令牌,则输出一个需要在浏览器中打开的 F1TV 登录链接;
  3. 本地存储认证令牌:登录成功后,令牌被保存在本地,供后续请求复用;
  4. 后续请求自动携带令牌:后续的数据请求无需再次登录。

上述流程在源码 fastf1/internals/f1auth.py 的get_auth_token()函数(L135-L175)中有完整实现,其实际执行逻辑比文档描述更细致:

  • 令牌加载:模块级变量_subscription_token首先在内存中查找;若为空,则从令牌文件读取;
  • 令牌验证:若令牌存在,会通过_verify_jwt()向 F1 官方的 JWKS 端点(https://api.formula1.com/static/jwks.json)拉取公钥并校验签名,验证失败(InvalidTokenError/PyJWTError)时自动将令牌置空并提示"请重新认证";
  • 触发登录:令牌为空或无效时调用_run_auth_server()启动本地回调服务,等待登录完成;
  • 令牌落盘:登录成功后,将令牌写入本地文件,下次直接复用。

浏览器扩展是登录链路的关键一环

文档特别强调:Fast-F1 的登录流程依赖一个浏览器扩展来完成。具体机制如下:

  • Fast-F1 启动登录时,会在本机127.0.0.1随机端口起一个 HTTP 回调服务器(见 f1auth.py 的_run_auth_server()),并打印形如https://f1login.fastf1.dev?port=<port>的链接;
  • 若浏览器尚未安装配套扩展,打开该链接会跳转到扩展下载页面;
  • 扩展安装并正常工作后,会重定向到成功状态页,并将登录会话(loginSessioncookie)通过 POST 请求回传给本地回调服务器;
  • 回调服务器(AuthHandler.do_POST,L48-L67)解析 POST 数据中的loginSession,从中提取subscriptionToken并置位线程事件,通知主流程认证完成。

可以直接访问f1login.fastf1.dev安装或检查扩展状态:安装正常会看到成功提示,否则会看到扩展下载选项。

认证不支持的环境

官方文档在.. note::中明确声明:由于登录方式的限制,托管型环境与 WebAssembly 环境不支持认证,典型包括:

  • Google Colab 等托管 Jupyter 环境;
  • Jupyter Lite 等基于 WebAssembly 的环境。

这是因为登录流程要求浏览器扩展与本地回调服务器协作,而这两者在上述环境中均无法运行。同样,livetiming.rst 也复述了该限制,Live Timing 客户端在上述环境不可用。

令牌的存储位置与数据结构

从源码(f1auth.py)可以确认令牌的存储约定:

  • 数据目录由platformdirs.user_data_dir("fastf1", ensure_exists=True)决定,即遵循各操作系统标准的用户数据目录规范(Linux 下通常在~/.local/share/fastf1,Windows 下在%LOCALAPPDATA%,macOS 下在~/Library/Application Support);
  • 令牌文件固定命名为f1auth.json,文件在导入模块时即被创建(touch);
  • 文件内容就是订阅令牌字符串本身(写入时直接f.write(_subscription_token),见 L172-L173)。

依赖清单方面,pyproject.toml 中与认证相关的直接依赖包括pyjwt(JWT 解析与校验)、platformdirs(跨平台数据目录)、requests(拉取 JWKS)与cryptography(RSA 公钥运算)。

令牌验证:基于 JWKS 的 RS256 签名校验

Fast-F1 没有简单地把令牌当作"黑盒"字符串直接使用,而是实现了完整的 JWT 校验链路(f1auth.py):

  1. 获取公钥_get_jwk_from_jwks_uri()从 F1 官方 JWKS 端点拉取密钥集,根据令牌头部kid字段匹配对应密钥;
  2. 转换公钥:通过RSAAlgorithm.from_jwk(jwk)将 JWK 格式转换为可用的 RSA 公钥;
  3. 解码验证:调用jwt.decode()RS256算法完成签名验证与解码。

该验证函数支持audienceissuerverifyoptions等参数扩展。在查询状态(print_auth_status)时则使用verify=False仅解码令牌,用于读取exp(过期时间戳)、SubscriptionStatusSubscribedProduct等字段并判断令牌是否过期。

命令行接口:认证的全生命周期管理

官方文档给出了认证管理的 CLI 入口:

python -m fastf1 auth f1tv [--authenticate] [--clear] [--status]

该命令的实现位于 fastf1/main.py,由argparse构建,auth子命令下再细分f1tv服务,三个动作参数构成互斥组add_mutually_exclusive_group),不能同时使用。完整说明如下:

参数对应源码函数作用
python -m fastf1 auth f1tv --authenticateget_auth_token()手动启动认证流程(检测/验证令牌,必要时触发浏览器登录)
python -m fastf1 auth f1tv --clearclear_auth_token()删除本地存储的认证令牌(内存与磁盘文件一并清除)
python -m fastf1 auth f1tv --statusprint_auth_status()显示当前认证状态与令牌信息

不加任何动作参数时,CLI 会打印auth子命令的帮助信息。

--status 的典型输出

基于print_auth_status()的实现(L186-L210),--status的输出包含三类信息:

  • Token StatusEXPIREDExpires <时间> (UTC)(依据令牌exp字段与当前时间比较);
  • Subscription Status:令牌内声明的订阅状态字段;
  • Subscribed Product:订阅的产品类型(Access / Pro / Premium 等)。

未找到令牌时输出Not authenticated。令牌无效或过期时,文档与源码都建议重新执行--authenticate

手动清除令牌的适用场景

--clear会删除f1auth.json并清空内存令牌。当出现以下情况时适合手动清除后重新认证:

  • 订阅过期或更换了 F1TV 账号;
  • 令牌被判定为无效(源码在验证失败时会打印 "Subscription token is invalid. Please re-authenticate.");
  • 希望切换到另一个 F1TV 账户获取数据。

认证在 Live Timing 客户端中的实际调用链

认证令牌最终服务于 Live Timing 数据录制。在 fastf1/livetiming/client.py 的SignalRClient中可以看到完整接入点:

  • 构造函数(L84-L90)提供no_auth: bool = False参数,置为True时客户端将尝试不带认证连接;
  • 连接建立时(L158-L184),options["access_token_factory"]被设置为None if self._no_auth else get_auth_token,即默认情况下建立 SignalR 连接时会自动调用认证流程获取令牌;
  • 若令牌缺失或失效,get_auth_token()会触发上文描述的浏览器登录流程,登录完成后自动继续连接。

需要特别说明:no_auth=True的未认证连接"可能只对部分场次有效,或只能返回空数据/不完整数据"(见 client.py L76-L78 的 docstring),因此正常录制仍应使用已认证连接。从源码结构看,认证是信号源访问的强制环节,并非可选项。

常见问题与排障建议

结合文档与源码,汇总实践中可能遇到的问题及应对方式:

  • 浏览器打开登录链接后看不到成功页:多半是浏览器扩展未安装或未启用。请检查扩展安装状态,或直接访问f1login.fastf1.dev获取下载选项;
  • 提示 "Subscription token is invalid":令牌签名校验失败,执行python -m fastf1 auth f1tv --clear清除后重新--authenticate
  • 提示 "Sign-in successful, but token verification failed":登录成功但签名验证阶段出错(对应源码 L85-L89 的PyJWTError分支),建议清除令牌重试;
  • 在 Colab / Jupyter Lite 中使用报错:环境限制所致,认证与 Live Timing 在这些平台不支持,请改用本机 Python 环境(如本机 Jupyter Notebook / VS Code);
  • 录制中断:Live Timing 客户端与认证本身无关的注意事项见 livetiming.rst——连接约 2 小时后可能被服务端断开,需要手动重启录制并换用新输出文件。

延伸阅读

  • Live Timing Client 文档:认证的真正消费方,含SignalRClient录制与数据加载完整示例;
  • 认证实现源码:回调服务器、JWT 校验、令牌读写全流程;
  • CLI 入口源码:auth f1tv子命令的参数解析实现;
  • v3.7.0 更新日志:认证功能引入背景与 Live Timing 新端点说明;
  • 项目依赖声明:pyjwtplatformdirsrequests等认证相关依赖版本要求。

【免费下载链接】Fast-F1FastF1 is a python package for accessing and analyzing Formula 1 results, schedules, timing data and telemetry项目地址: https://gitcode.com/GitHub_Trending/fa/Fast-F1

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

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

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

立即咨询