如何确定 PyJWT 的版本?

Posted

技术标签:

【中文标题】如何确定 PyJWT 的版本?【英文标题】:How to determine the version of PyJWT? 【发布时间】:2017-03-04 08:16:30 【问题描述】:

我有两个不同的软件环境(Environment AEnvironment B),我正在尝试在这两个环境上运行 PyJWT。它在 Environment A 的一个环境中工作得非常好,但在 Environment B 上却失败了。

当我使用algorithm == ES 调用jwt.encode() 时,我遇到的环境B错误是:Algorithm not supported

我试图弄清楚为什么它适用于环境 A,而不适用于 环境 B。似乎这两个环境安装了不同版本的 PyJWT。但是确定在 Environment B 上安装了哪个版本的 PyJWT 对我来说很困难。我该怎么做??

我在 Environment AEnvironment B 上运行了以下检测代码:

import jwt, cryptography, sys, pkg_resources

my_private_key = """XXXXX"""
my_public_key = """YYYYYY"""
original = "Hello": "World"
print "sys.version = ".format(str(sys.version))

try:
    print "dir(jwt) = ".format(str(dir(jwt)))
except Exception as e:
    print "Failed to get dir of jwt module: ".format(e)

try:
    print "dir(cryptography) = ".format(str(dir(cryptography)))
except Exception as e:
    print "Failed to get dir of cryptography module: ".format(e)

try:
    print "jwt = ".format(str(jwt.__version__))
except Exception as e:
    print "Failed to get version of jwt module using .__version: ".format(e)
try:
    print "cryptography = ".format(str(cryptography.__version__))
except Exception as e:
    print "Failed to get version of cryptography module using .__version: ".format(e)

try:
    print "pkg_resources.require('jwt')[0].version = ".format(str(pkg_resources.require("jwt")[0].version))
except Exception as e:
    print "Failed to get version of jwt module via pkg_resources: ".format(e)

try:
    print "pkg_resources.require('cryptography')[0].version = ".format(str(pkg_resources.require("cryptography")[0].version))
except Exception as e:
    print "Failed to get version of cryptography module via pkg_resources: ".format(e)

try:
    print "original = ".format(str(original))
    encoded = jwt.encode(original, my_private_key, algorithm='ES256')
except Exception as e:
    print "encoding exception = ".format(str(e))
else:
    try:
        print "encoded = ".format(str(encoded))
        unencoded = jwt.decode(encoded, my_public_key, algorithms=['ES256'])
    except Exception as e:
        print "decoding exception = ".format(str(e))
    else:
        print "unencoded = ".format(str(unencoded))

环境A上,编码成功:

sys.version = 2.7.12 (default, Sep  1 2016, 22:14:00)
[GCC 4.8.3 20140911 (Red Hat 4.8.3-9)]
dir(jwt) = ['DecodeError', 'ExpiredSignature', 'ExpiredSignatureError', 'ImmatureSignatureError', 'InvalidAudience', 'InvalidAudienceError', 'InvalidIssuedAtError', 'InvalidIssuer', 'InvalidIssuerError', 'InvalidTokenError', 'MissingRequiredClaimError', 'PyJWS', 'PyJWT', '__author__', '__builtins__', '__copyright__', '__doc__', '__file__', '__license__', '__name__', '__package__', '__path__', '__title__', '__version__', 'algorithms', 'api_jws', 'api_jwt', 'compat', 'decode', 'encode', 'exceptions', 'get_unverified_header', 'register_algorithm', 'unregister_algorithm', 'utils']
dir(cryptography) = ['__about__', '__all__', '__author__', '__builtins__', '__copyright__', '__doc__', '__email__', '__file__', '__license__', '__name__', '__package__', '__path__', '__summary__', '__title__', '__uri__', '__version__', 'absolute_import', 'division', 'exceptions', 'hazmat', 'print_function', 'sys', 'utils', 'warnings']
jwt = 1.4.2
cryptography = 1.5.2
Failed to get version of jwt module via pkg_resources: jwt
pkg_resources.require('cryptography')[0].version = 1.5.2
original = 'Hello': 'World'
encoded = eyJhbGciOiJFUzI1NiIsInR5cCI6IkpXVCJ9.eyJIZWxsbyI6IldvcmxkIn0.ciaXCcO2gTqsQ4JUEKj5q4YX6vfHu33XY32g2MNIVEDXHNllpuqDCj-cCrlGPf6hGNifAJbNI9kBaAyuCIwyJQ
unencoded = u'Hello': u'World'

环境 B 上编码失败。您可以看到我无法分辨正在运行的 PyJWT 版本。然而,这个版本的 PyJWT 没有我正在尝试使用的算法 ES256

sys.version = 2.7.12 (default, Sep  1 2016, 22:14:00) 
[GCC 4.8.3 20140911 (Red Hat 4.8.3-9)]"
dir(jwt) = ['DecodeError', 'ExpiredSignature', 'Mapping', 'PKCS1_v1_5', 'SHA256', 'SHA384', 'SHA512', '__all__', '__builtins__', '__doc__', '__file__', '__name__', '__package__', '__path__', 'base64', 'base64url_decode', 'base64url_encode', 'binascii', 'constant_time_compare', 'datetime', 'decode', 'encode', 'hashlib', 'header', 'hmac', 'json', 'load', 'signing_methods', 'sys', 'timegm', 'unicode_literals', 'verify_methods', 'verify_signature']
dir(cryptography) = ['__about__', '__all__', '__author__', '__builtins__', '__copyright__', '__doc__', '__email__', '__file__', '__license__', '__name__', '__package__', '__path__', '__summary__', '__title__', '__uri__', '__version__', 'absolute_import', 'division', 'print_function', 'sys', 'warnings']
Failed to get version of jwt module using .__version: 'module' object has no attribute '__version__'
cryptography = 1.5.2
Failed to get version of jwt module via pkg_resources: jwt
pkg_resources.require('cryptography')[0].version = 1.5.2
original = 'Hello': 'World'
encoding exception = Algorithm not supported

【问题讨论】:

【参考方案1】:

PyJWT .__version__ 属性出现在 0.2.2 中的 this 提交中。

通常,要查找通过 setuptools 安装的软件包的版本,您需要运行以下代码:

import pkg_resources
print pkg_resources.require("jwt")[0].version

如果使用pip安装包,你可以从linux shell试试:

pip show jwt | grep Version

在 python 内部也是一样的:

import pip
print next(pip.commands.show.search_packages_info(['jwt']))['version']

【讨论】:

你知道为什么这对我不起作用吗? gist.github.com/saqib-zmi/ac3d0f2106b76e729cfb54008995181d 原因是该软件包不是通过 setuptools 安装的。此代码仅允许您确定该案例的版本。 如果使用了pip,还包括在答案中查找版本的命令。 表,有没有办法从我的python代码中而不是从Linux命令行显示pip安装的jwt版本? 是的,你可以试试pippython-binding。 import pip;next(pip.commands.show.search_packages_info(['jwt']))['version']。也添加在答案中【参考方案2】:

我用过

print(jwt.__version__)

而且效果很好。

【讨论】:

以上是关于如何确定 PyJWT 的版本?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 pyJWT 验证此 JWT 上的签名?

如何使用带有公共 PEM 证书的 python PyJWT 验证 JWT?

如何确定组件是不是与当前版本的 Spring 兼容

如何确定python库的所有可用版本?

如何确定已安装的 webpack 版本

如何确定哪个旧版本的 R 包与我的 R 版本兼容