升级Requests至2.26.0后调用Firebase auth.verify_id_token出现RecursionError
问题根因
- 核心兼容冲突:你使用的Requests 2.24.0及以上版本绑定的urllib3组件,和环境中对标准库
ssl.SSLContext做了猴子补丁的工具(最常见为pyopenssl库、gevent运行时补丁)存在逻辑冲突。urllib3在配置SSL上下文的options属性时,被补丁修改后的setter方法会循环调用父类的赋值方法,最终触发递归深度超限错误。 - 代码笔误补充:你提供的代码片段存在一处写法错误:
requests.headers['X-Bearer-Token']中requests是第三方库模块本身,不携带请求headers属性,需要替换为你当前使用的web框架的请求实例(比如Flask/Django的request对象),但该笔误不是本次递归错误的触发原因。
解决方案
以下方案任选其一即可解决问题:
- 方案1:升级依赖到修复后的稳定版本
将requests升级到2.27.1以上,urllib3升级到1.26.0以上,同时将firebase-admin升级到最新稳定版,上述版本已经官方修复了该SSLContext递归兼容问题。 - 方案2:移除冲突的pyopenssl库
如果你的服务没有强制依赖pyopenssl的特殊场景,直接执行命令pip uninstall pyopenssl即可。卸载后urllib3会自动调用标准库原生ssl模块,不会触发补丁冲突。 - 方案3:强制禁用urllib3的pyopenssl适配
如果必须保留当前的依赖版本,可以在项目启动入口文件的最顶部添加如下代码:
import urllib3.contrib.pyopenssl urllib3.contrib.pyopenssl.extract_from_urllib3()
该代码会强制urllib3停止使用pyopenssl的适配逻辑,直接绕过冲突。
- 方案4:升级Python版本
你当前使用的Python 3.6已经停止官方维护,升级到Python 3.8及以上版本也可以规避大量旧版本存在的依赖兼容问题。
内容的提问来源于stack exchange,提问作者Gabriel Blondeau
相关产品推荐
相关产品推荐

