Flask项目使用Firebase Auth验证Token时出现解析段错误
问题排查与解决方案
可能的原因及对应修复方法
1. Authorization头未处理Bearer前缀
Firebase Auth的Token通常以Bearer <token>格式放在Authorization头中,如果代码直接读取整个头内容而未移除Bearer 前缀,会导致verify_id_token无法解析非标准格式的Token,抛出段解析错误。
修复代码,添加前缀处理逻辑:
def check_token(f): @wraps(f) def wrap(*args,**kwargs): token = request.headers.get('Authorization') if not token: return {'message': 'No token provided'},400 # 移除Bearer前缀(如果存在) if token.startswith('Bearer '): token = token[7:].strip() # 截取"Bearer "之后的内容 try: user = auth.verify_id_token(token) except Exception as e: print(f'Error verifying token: {e}') return {'message':'Invalid token provided.'},400 else: request.user = user return f(*args, **kwargs) return wrap
2. Token存在URL编码或转义问题
若前端传递Token时对其进行了URL编码(特殊字符被转义),后台拿到的是编码后的字符串,无法被正确解析。可添加解码步骤:
from urllib.parse import unquote def check_token(f): @wraps(f) def wrap(*args,**kwargs): token = request.headers.get('Authorization') if not token: return {'message': 'No token provided'},400 if token.startswith('Bearer '): token = token[7:].strip() # 解码URL编码的Token token = unquote(token) try: user = auth.verify_id_token(token) except Exception as e: print(f'Error verifying token: {e}') return {'message':'Invalid token provided.'},400 else: request.user = user return f(*args, **kwargs) return wrap
3. Firebase Admin SDK缓存或版本问题
verify_id_token依赖缓存的公钥验证Token,若缓存的公钥损坏或过期,会导致解析失败。可尝试:
- 升级firebase-admin到最新版本:
pip install --upgrade firebase-admin - 重启Flask服务,清除SDK的公钥缓存
额外排查步骤
在验证前打印处理后的Token,确认其是否为标准JWT格式(三段式、用.分隔的字符串):
print(f"Processed token: {token}")
若打印内容不符合标准格式,说明前端Token的获取或传递逻辑存在问题,需排查前端代码。
内容的提问来源于stack exchange,提问作者Mansour
相关产品推荐
相关产品推荐

