用Python验证Firebase签发的JWT及Lambda授权机制迁移问题
问题解决思路与方案
一、AWS Lambda授权器的验证机制
你提到的Lambda授权器看似“仅凭借Issuer URL和Audience验证令牌”,实际是AWS帮你封装了底层公钥获取与验证流程:
- 若Lambda授权器配置为OIDC身份提供商类型,它会自动根据Issuer URL,从对应的标准公钥端点拉取验证所需的公钥
- 后台自动完成JWT签名校验、Issuer匹配、Audience匹配、过期时间校验等核心步骤
- 你感知不到公钥操作,是因为这些逻辑被Lambda授权器的内置服务完全封装了
二、Firebase JWT的正确公钥获取方式
你访问的https://securetoken.google.com/orca-ai-dashboard/.well-known/jwks.json是错误的路径。Firebase的ID Token公钥并非按项目单独提供,而是统一使用Google的全局服务账号公钥端点:
https://www.googleapis.com/service_accounts/v1/jwk/securetoken@system.gserviceaccount.com
该地址会返回有效的JWKS格式数据,包含所有验证Firebase签发JWT所需的公钥。
三、Python验证Firebase JWT的实现
1. 安装依赖
pip install pyjwt requests
2. 验证代码示例
import jwt import requests import json from jwt.exceptions import InvalidTokenError def verify_firebase_jwt(token, project_id): # 固定配置参数 issuer = f"https://securetoken.google.com/{project_id}" audience = project_id # 获取Firebase全局公钥 jwks_url = "https://www.googleapis.com/service_accounts/v1/jwk/securetoken@system.gserviceaccount.com" jwks_response = requests.get(jwks_url) jwks_keys = jwks_response.json()["keys"] # 提取令牌头中的kid,匹配对应公钥 header = jwt.get_unverified_header(token) kid = header["kid"] public_key = None for key in jwks_keys: if key["kid"] == kid: public_key = jwt.algorithms.RSAAlgorithm.from_jwk(json.dumps(key)) break if not public_key: raise ValueError("未找到与令牌匹配的公钥") # 执行完整验证 try: payload = jwt.decode( token, public_key, algorithms=["RS256"], issuer=issuer, audience=audience, options={"verify_exp": True} ) return payload except InvalidTokenError as e: raise ValueError(f"令牌验证失败: {str(e)}") # 调用示例 if __name__ == "__main__": test_token = "你的Firebase JWT令牌" try: valid_payload = verify_firebase_jwt(test_token, "orca-ai-dashboard") print("验证成功,令牌载荷:", valid_payload) except ValueError as e: print("验证失败:", e)
3. 核心验证要点
- 必须校验
iss字段是否等于https://securetoken.google.com/你的项目ID - 必须校验
aud字段是否等于你的项目ID - 必须启用过期时间(
exp字段)校验,避免使用失效令牌 - 固定使用
RS256算法,Firebase ID Token仅用该算法签名
四、EC2上复刻Lambda授权机制的注意事项
- 令牌提取:从HTTP请求的
Authorization头中提取Bearer <token>格式的令牌 - 公钥缓存:不要每次验证都请求JWKS端点,建议将公钥缓存1小时左右,提升性能并减少请求量
- 错误响应:针对不同验证失败场景(令牌过期、签名无效、Issuer/Audience不匹配等),返回对应的HTTP 401/403状态码
内容的提问来源于stack exchange,提问作者Noam Zadok
相关产品推荐
相关产品推荐

