You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 00:05:59