Python中的JSON Web Token实现(PyJWT的分支)
项目描述
这是由Privex Inc.维护的https://github.com/jpadilla/pyjwt的分支,允许我们添加自己的更新,这些更新可能在上游的jpadilla/pyjwt中不会被接受。
我们的分支以privex-pyjwt发布,而原始版本以PyJWT发布 - 这两个包是互不兼容的,因为它们都使用jwt顶级命名空间。
Privex相对于原始PyJWT包添加的显著特性
- 版本 1.8.0
添加了对EdDSA (Ed25519) JWT签名和验证的支持
Python对RFC 7519的实现。原始实现由@progrium编写。
安装
使用pip安装
pip install privex-pyjwt
使用pipenv安装
pipenv install privex-pyjwt
注意:
要使用RSA和Ed25519 (EdDSA)签名/验证,需要cryptography包。
要使用EcDSA签名/验证,需要ecdsa包。
额外包
pip install -U 'cryptography>=2.6' ecdsa # or with pipenv pipenv install 'cryptography>=2.6' ecdsa
赞助商公告
这个分支是由Privex创建的。通过从我们这里购买服务器来支持其开发 :)
用法
>>> import jwt
>>> encoded = jwt.encode({'some': 'payload'}, 'secret', algorithm='HS256')
>>> print(encoded)
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzb21lIjoicGF5bG9hZCJ9.4twFt5NiznN84AWoo1d7KO1T_yoc0Z6XOpOVswacPZg
>>> jwt.decode(encoded, 'secret', algorithms=['HS256'])
{'some': 'payload'}
使用EdDSA / Ed25519
自版本 1.8.0 以来,Privex 分支增加了对 EdDSA / Ed25519 的支持。Privex 分支
我们的 privex-pyjwt 包与其它 JWT EdDSA 实现(例如 NodeJS 的 Jose 包)兼容。它可以使用 Ed25519 密钥签名令牌,这些令牌可以通过 NodeJS Jose 进行验证,并且可以使用 NodeJS Jose 验证使用 Ed25519 签名的令牌。
生成/加载 Ed25519 (EdDSA) 密钥
如果您希望能够在您的 Python 应用程序中轻松地生成 Ed25519、RSA 和 ECDSA 公钥/私钥,请考虑使用 Privex 的 Python Helper,它包含一个设计用于简化对称/非对称加密的加密模块。
安装 Privex Helper
# For a minimal install with just the cryptography dependencies # change [full] to [crypto] (though [full] only adds a few small dependencies) pip3 install 'privex-helpers[full]'
您可以根据需要加载/生成 Ed25519 的私钥/公钥,但我们使用 Privex Helper 的 crypto 模块作为示例(以及我们库的展示)。
以下代码使用 Privex Helper 生成 Ed25519 密钥对,并将私钥输出到 id_ed25519,公钥输出到 id_ed25519.pub。
如果您不想将密钥保存到文件中,可以使用 ed_priv, ed_pub = KeyManager.generate_keypair('ed25519') 代替。
from privex.helpers import KeyManager
ed_priv, ed_pub = KeyManager.output_keypair('id_ed25519', 'id_ed25519.pub', alg='ed25519')
# ed_priv example contents:
# b'-----BEGIN PRIVATE KEY-----\nMC4CAQAwBQYDK2VwBCIEIBy9N4xfv/9qOiKrxwRKeGfO5ab6lSukKHbuC5vaJ1Mg\n-----END PRIVATE KEY-----\n'
# ed_pub example contents:
# b'ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIC4pK2dePGgctIAsh0H/tmUrLzx2Vc4Ltc8TN9nfuChG'
使用 privex-pyjwt 对 EdDSA 编码/解码 JWT 令牌
私钥必须是带有 PKCS8 的 PEM 格式,而公钥可以是 PEM (PKCS8) 格式或 OpenSSH 格式(ssh-ed25519 ........ user@host)。
只需像平常一样使用 jwt.encode 和 jwt.decode,传递您的 Ed25519 私钥进行编码,私钥/公钥进行解码,并将算法设置为 EdDSA。
import jwt
# Tokens can only encoded with an Ed25519 private key
token = jwt.encode({'hello': 'world'}, ed_priv, algorithm='EdDSA')
# resulting token: b'eyJ0eXAiOiJKV1QiLCJhbGciOiJFZERTQSJ9.eyJoZWxsbyI6IndvcmxkIn0.HEDJTw1jNaz82WuP3O1l5_i-eaaj3DBEKesPUsInSgKuvbav6XaLORERs7wPrmS14DN_WlzDUCn0LmVGl4VlCg'
# However, tokens can be decoded using EITHER the public key (PEM / OpenSSH) or the private key,
# as we can interpolate the public key from the private key
jwt.decode(token, ed_priv, algorithms=['EdDSA'])
# Output: {'hello': 'world'}
命令行
用法
pyjwt [options] INPUT
解码示例
pyjwt --key=secret decode TOKEN pyjwt decode --no-verify TOKEN
执行 pyjwt --help 查看更多选项。
文档
测试
在克隆项目后,可以从项目根目录运行测试。
$ tox
项目详情
下载文件
下载适用于您平台的文件。如果您不确定选择哪个,请了解更多关于 安装包 的信息。