JWT 在 jwt.io 上解码,但不在应用程序中

Posted

技术标签:

【中文标题】JWT 在 jwt.io 上解码,但不在应用程序中【英文标题】:JWT decoded on jwt.io, but not in application 【发布时间】:2018-06-02 09:47:51 【问题描述】:

我正在尝试解码从 Auth0 获得的 JWT。当我访问 jwt.io 时,他们有一个解码器,您可以将 JWT 放入其中,它会告诉您有关 JWT 每个部分的所有信息。我可以看到所有信息都是正确的。但是,当我尝试自己对其进行解码时,出现此错误。 我从我的 Auth0 注册客户端信息中获取密钥,并且有一条注释说:客户端密钥不是 base64 编码的。我需要在使用它之前对这个秘密进行base64编码吗?

ValueError: Could not unserialize key data.

终端

>>> import jwt

>>> secret = secret
>>> encoded_jwt = encoded_jwt
>>> decoded_jwt = jwt.decode(encoded_jwt, secret, algorithm="RS256")

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/lib/python3.6/site-packages/jwt/api_jwt.py", line 78, in decode
    jwt, key=key, algorithms=algorithms, options=options, **kwargs
  File "/usr/local/lib/python3.6/site-packages/jwt/api_jws.py", line 140, in decode
    key, algorithms)
  File "/usr/local/lib/python3.6/site-packages/jwt/api_jws.py", line 204, in _verify_signature
    key = alg_obj.prepare_key(key)
  File "/usr/local/lib/python3.6/site-packages/jwt/algorithms.py", line 207, in prepare_key
    key = load_pem_public_key(key, backend=default_backend())
  File "/usr/local/lib/python3.6/site-packages/cryptography/hazmat/primitives/serialization.py", line 24, in load_pem_public_key
    return backend.load_pem_public_key(data)
  File "/usr/local/lib/python3.6/site-packages/cryptography/hazmat/backends/multibackend.py", line 314, in load_pem_public_key
    return b.load_pem_public_key(data)
  File "/usr/local/lib/python3.6/site-packages/cryptography/hazmat/backends/openssl/backend.py", line 1110, in load_pem_public_key
    self._handle_key_loading_error()
  File "/usr/local/lib/python3.6/site-packages/cryptography/hazmat/backends/openssl/backend.py", line 1325, in _handle_key_loading_error
    raise ValueError("Could not unserialize key data.")
ValueError: Could not unserialize key data.

【问题讨论】:

【参考方案1】:

由于您没有提及 PUBLIC KEY 或 PRIVATE KEY,因此您似乎正在尝试使用“RS256”算法进行解码,但您的令牌使用“HS256”。

尝试:

decoded_jwt = jwt.decode(encoded_jwt, secret, algorithm="HS256")

代替:

decoded_jwt = jwt.decode(encoded_jwt, secret, algorithm="RS256")

如果您愿意,可以在此地址使用 base64 对密钥进行编码: https://www.base64encode.org/

您可以通过选中 jwt.io 上的“验证签名”部分下的“秘密 base64 编码”复选框来验证编码密钥。

【讨论】:

您不会碰巧知道如何从 RSA 证书中获取公钥/私钥吗?在撰写本文时,我以为我使用了来自 Auth0 的 client_secret,但现在经过大量研究知道我需要从证书中获取的公钥。我设法获得了证书,但在获得公钥时遇到了很多麻烦。 此链接可能对您有所帮助:***.com/questions/9497719/…

以上是关于JWT 在 jwt.io 上解码,但不在应用程序中的主要内容,如果未能解决你的问题,请参考以下文章

为啥jwt.io不能解码google JWT token

使用 RS256 生成的 JWT 可以被 jwt.io 网站解码吗?

JWT 解码失败,exp 值无效

JWT 解码返回 null

jwt.io 从哪里获取 JWT 令牌的公钥?

如何验证在 jwt.io 上使用 Keycloak 身份验证提供程序创建的 HS256 签名 JWT 令牌