JWT 在 jwt.io 上解码,但不在应用程序中
JWT decoded on jwt.io, but not in application
我正在尝试解码从 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.
由于您没有提到 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 处的 "secret base64 encoded" 复选框来验证编码密钥。
我正在尝试解码从 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.
由于您没有提到 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 处的 "secret base64 encoded" 复选框来验证编码密钥。