使用PyJWT在Python中解码Firebase JWT出现PEM格式密钥错误如何解决
错误原因
- 你从Google接口请求拿到的
key_list实际是键为kid(密钥ID)、值为PEM格式公钥的字典,不是可直接传入jwt.decode的密钥参数,这是报错的核心原因 - 你直接传入单个密钥内容时报错,大概率是没有匹配JWT Header中携带的kid对应的公钥,或是缺少PyJWT所需的加密依赖
修正方案
首先安装正确依赖:
pip install pyjwt cryptography requests
修改代码逻辑:先解析JWT未签名的头部获取对应kid,再匹配对应公钥后完成解码,示例代码如下:
import jwt import requests def check_token(token): # 获取Google公钥字典 response = requests.get("https://www.googleapis.com/robot/v1/metadata/x509/securetoken@system.gserviceaccount.com") public_keys = response.json() # 解析JWT头获取kid jwt_header = jwt.get_unverified_header(token) kid = jwt_header["kid"] # 取出匹配的PEM公钥 target_public_key = public_keys[kid] # 解码验证JWT,务必补充aud、iss校验参数避免安全漏洞 decoded_token = jwt.decode( token, key=target_public_key, algorithms=["RS256"], audience="你的Firebase项目ID", issuer="https://securetoken.google.com/你的Firebase项目ID" ) print(f"Decoded token : {decoded_token}")
注意:必须补充aud、issuer校验参数,否则你的验证逻辑存在安全漏洞,会接受任意签名合法的JWT。
内容的提问来源于stack exchange,提问作者Tom3652
相关产品推荐
相关产品推荐

