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 将认证过程概括为以下四个步骤:
- 检查现有有效认证令牌:优先复用本地已存储的令牌,避免重复登录;
- 提供登录 URL:若无有效令牌,则输出一个需要在浏览器中打开的 F1TV 登录链接;
- 本地存储认证令牌:登录成功后,令牌被保存在本地,供后续请求复用;
- 后续请求自动携带令牌:后续的数据请求无需再次登录。
上述流程在源码 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):
- 获取公钥:
_get_jwk_from_jwks_uri()从 F1 官方 JWKS 端点拉取密钥集,根据令牌头部kid字段匹配对应密钥; - 转换公钥:通过
RSAAlgorithm.from_jwk(jwk)将 JWK 格式转换为可用的 RSA 公钥; - 解码验证:调用
jwt.decode()以RS256算法完成签名验证与解码。
该验证函数支持audience、issuer、verify、options等参数扩展。在查询状态(print_auth_status)时则使用verify=False仅解码令牌,用于读取exp(过期时间戳)、SubscriptionStatus、SubscribedProduct等字段并判断令牌是否过期。
命令行接口:认证的全生命周期管理
官方文档给出了认证管理的 CLI 入口:
python -m fastf1 auth f1tv [--authenticate] [--clear] [--status]该命令的实现位于 fastf1/main.py,由argparse构建,auth子命令下再细分f1tv服务,三个动作参数构成互斥组(add_mutually_exclusive_group),不能同时使用。完整说明如下:
| 参数 | 对应源码函数 | 作用 |
|---|---|---|
python -m fastf1 auth f1tv --authenticate | get_auth_token() | 手动启动认证流程(检测/验证令牌,必要时触发浏览器登录) |
python -m fastf1 auth f1tv --clear | clear_auth_token() | 删除本地存储的认证令牌(内存与磁盘文件一并清除) |
python -m fastf1 auth f1tv --status | print_auth_status() | 显示当前认证状态与令牌信息 |
不加任何动作参数时,CLI 会打印auth子命令的帮助信息。
--status 的典型输出
基于print_auth_status()的实现(L186-L210),--status的输出包含三类信息:
- Token Status:
EXPIRED或Expires <时间> (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 新端点说明;
- 项目依赖声明:
pyjwt、platformdirs、requests等认证相关依赖版本要求。
【免费下载链接】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),仅供参考