我正尝试在我的python代码中使用jwt.io生成的JWT,并使用jwcrypto,并取得了一些成功。我说的是一些成功,因为我可以在不验证签名的情况下检索声明(错误的方式)。
这是我的密码
from jwcrypto import jwt, jwk
jwtIoToken = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c'
theJwt = jwt.JWT(jwt=jwtIoToken)
print(theJwt)
print(theJwt.token.objects)jwtIoToken值是从jwt.io逐字获取的。我本来希望能够只做一个theJwt.claims,但它被设置为None。我的直觉是,我需要验证签名,但我不知道如何做,没有密钥,我不知道jwt.io正在使用什么。
发布于 2022-09-12 19:42:18
您可以在正确的列“验证签名”下找到jwt.io使用的密钥。除非添加任何不同的内容,否则默认值是“您的-256位秘密”。

使用该值时,可以使用下面的代码验证签名。
jwcrypto的使用比pyjwt要复杂一些。在这里,您必须首先初始化一个JWK对象并从给定的秘密创建密钥,然后将密钥传递给verify(key)-function:
from jwcrypto import jws, jwk
jwtIoToken = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c'
key = jwk.JWK().from_password("your-256-bit-secret")
jwstoken = jws.JWS()
jwstoken.deserialize(jwtIoToken)
jwstoken.verify(key)
payload = jwstoken.payload
print(payload.decode())发布于 2022-11-21 14:31:36
我可以建议您使用名为jwcrypto的jwskate的替代方案。
正如您已经注意到的,jwcrypto非常复杂的导入和API使得使用起来不直观,而jwskate有一个更方便和Pythonic:
from jwskate import Jwt, SymmetricJwk
# you can access the token contents, as a dict, without verifying the signature:
jwt = Jwt('eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c')
assert jwt.claims == {'sub': '1234567890', 'name': 'John Doe', 'iat': 1516239022}
# or you can access individual claims this way
assert jwt['sub'] == jwt.sub == '1234567890'
assert jwt['name'] == jwt.name == 'John Doe'
from datetime import datetime, timezone
assert jwt.issued_at == datetime(2018, 1, 18, 1, 30, 22, tzinfo=timezone.utc)
# if you want to verify the signature:
key = SymmetricJwk.from_bytes(b"your-256-bit-secret")
assert jwt.verify_signature(key, alg="HS256")免责声明:我是jwskate的作者。
https://stackoverflow.com/questions/73692941
复制相似问题