首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在jwcrypto中使用jwt.io提供的令牌?

如何在jwcrypto中使用jwt.io提供的令牌?
EN

Stack Overflow用户
提问于 2022-09-12 17:17:56
回答 2查看 64关注 0票数 0

我正尝试在我的python代码中使用jwt.io生成的JWT,并使用jwcrypto,并取得了一些成功。我说的是一些成功,因为我可以在不验证签名的情况下检索声明(错误的方式)。

这是我的密码

代码语言:javascript
复制
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正在使用什么。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-09-12 19:42:18

您可以在正确的列“验证签名”下找到jwt.io使用的密钥。除非添加任何不同的内容,否则默认值是“您的-256位秘密”。

使用该值时,可以使用下面的代码验证签名。

jwcrypto的使用比pyjwt要复杂一些。在这里,您必须首先初始化一个JWK对象并从给定的秘密创建密钥,然后将密钥传递给verify(key)-function:

代码语言:javascript
复制
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())
票数 1
EN

Stack Overflow用户

发布于 2022-11-21 14:31:36

我可以建议您使用名为jwcryptojwskate的替代方案。

正如您已经注意到的,jwcrypto非常复杂的导入和API使得使用起来不直观,而jwskate有一个更方便和Pythonic:

代码语言:javascript
复制
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的作者。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73692941

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档