在Python中使用PyJWT解码Firebase JWT



我写了以下代码:

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.
我遵循这个答案,但我得到这个错误。

requests转换问题吗?我做错了什么?

decode()中的第二个参数key似乎采用字符串值而不是列表。Google API请求返回一个包含多个键的字典/映射。流程如下:

  1. 从Google API端点获取公钥
  2. 然后在没有验证的情况下读取报头以获得kid声明,然后使用它从字典中获得适当的键
  3. 这是一个X.509 Certificate,而不是这个答案中的公钥,所以你需要从中获得公钥。

下面的函数为我工作:

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")

相关内容

  • 没有找到相关文章

最新更新