使用 PyJWT 在 Python 中解码 Firebase JWT
Decode Firebase JWT in Python using PyJWT
我写了下面的代码:
def check_token(token):
response = requests.get("https://www.googleapis.com/robot/v1/metadata/x509/securetoken@system.gserviceaccount.com")
key_list = response.json()
decoded_token = jwt.decode(token, key=key_list, algorithms=["RS256"])
print(f"Decoded token : {decoded_token}")
我正在尝试解码 firebase 客户端提供的 token
以在服务器端对其进行验证。
上面的代码抛出以下异常:
TypeError: Expecting a PEM-formatted key.
我试图不将列表传递给 jwt.decode
方法,只传递关键内容,我有一个更大的错误,库 could not deserialize the Key
.
我正在关注这个 answer 但我收到了这个错误。
是否是 requests
转换问题?我做错了什么?
decode()
中的第二个参数 key
似乎采用字符串值而不是列表。 Google API 请求 returns 包含多个键的 dict/map。流程如下:
- 从 Google API 端点获取 public 键
- 然后 read headers without validation 获取
kid
声明然后使用它从该字典中获取适当的密钥
- 那是
X.509 Certificate
而不是 this answer 中的 public 键,因此您需要从中获取 public 键。
以下功能对我有用:
import jwt
import requests
from cryptography.hazmat.backends import default_backend
from cryptography import x509
def check_token(token):
n_decoded = jwt.get_unverified_header(token)
kid_claim = n_decoded["kid"]
response = requests.get("https://www.googleapis.com/robot/v1/metadata/x509/securetoken@system.gserviceaccount.com")
x509_key = response.json()[kid_claim]
key = x509.load_pem_x509_certificate(x509_key.encode('utf-8'), backend=default_backend())
public_key = key.public_key()
decoded_token = jwt.decode(token, public_key, ["RS256"], options=None, audience="<FIREBASE_PROJECT_ID>")
print(f"Decoded token : {decoded_token}")
check_token("FIREBASE_ID_TOKEN")
我写了下面的代码:
def check_token(token):
response = requests.get("https://www.googleapis.com/robot/v1/metadata/x509/securetoken@system.gserviceaccount.com")
key_list = response.json()
decoded_token = jwt.decode(token, key=key_list, algorithms=["RS256"])
print(f"Decoded token : {decoded_token}")
我正在尝试解码 firebase 客户端提供的 token
以在服务器端对其进行验证。
上面的代码抛出以下异常:
TypeError: Expecting a PEM-formatted key.
我试图不将列表传递给 jwt.decode
方法,只传递关键内容,我有一个更大的错误,库 could not deserialize the Key
.
我正在关注这个 answer 但我收到了这个错误。
是否是 requests
转换问题?我做错了什么?
decode()
中的第二个参数 key
似乎采用字符串值而不是列表。 Google API 请求 returns 包含多个键的 dict/map。流程如下:
- 从 Google API 端点获取 public 键
- 然后 read headers without validation 获取
kid
声明然后使用它从该字典中获取适当的密钥 - 那是
X.509 Certificate
而不是 this answer 中的 public 键,因此您需要从中获取 public 键。
以下功能对我有用:
import jwt
import requests
from cryptography.hazmat.backends import default_backend
from cryptography import x509
def check_token(token):
n_decoded = jwt.get_unverified_header(token)
kid_claim = n_decoded["kid"]
response = requests.get("https://www.googleapis.com/robot/v1/metadata/x509/securetoken@system.gserviceaccount.com")
x509_key = response.json()[kid_claim]
key = x509.load_pem_x509_certificate(x509_key.encode('utf-8'), backend=default_backend())
public_key = key.public_key()
decoded_token = jwt.decode(token, public_key, ["RS256"], options=None, audience="<FIREBASE_PROJECT_ID>")
print(f"Decoded token : {decoded_token}")
check_token("FIREBASE_ID_TOKEN")