跳转到主要内容

Python中的JSON Web Token实现(PyJWT的分支)

项目描述

https://travis-ci.cn/Privex/pyjwt.svg?branch=master https://ci.appveyor.com/api/projects/status/h8nt70aqtwhht39t?svg=true https://img.shields.io/pypi/v/privex-pyjwt.svg https://coveralls.io/repos/Privex/pyjwt/badge.svg?branch=master https://readthedocs.org/projects/pyjwt/badge/?version=stable

这是由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

用法

>>> 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.encodejwt.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 查看更多选项。

文档

在线查看完整文档:https://pyjwt.readthedocs.io/en/stable/

测试

在克隆项目后,可以从项目根目录运行测试。

$ tox

项目详情


下载文件

下载适用于您平台的文件。如果您不确定选择哪个,请了解更多关于 安装包 的信息。

源代码分发

privex_pyjwt-2.0.0.tar.gz (48.0 kB 查看哈希值)

上传时间 源代码

构建分发

privex_pyjwt-2.0.0-py2.py3-none-any.whl (24.2 kB 查看哈希值)

上传时间 Python 2 Python 3

由以下支持

AWS AWS 云计算和安全赞助商 Datadog Datadog 监控 Fastly Fastly CDN Google Google 下载分析 Microsoft Microsoft PSF 赞助商 Pingdom Pingdom 监控 Sentry Sentry 错误日志 StatusPage StatusPage 状态页面