PyJWT(1.4.0)
- PyJWT是一个允许编码和解码JSON Web令牌(JWT)的Python库。JWT是一个开放的行业标准(RFC 7519),用于双方之间安全地声明。
安装
你能使用pip安装PyJWT
pip install pyjwt
加密依赖关系(可选)
- 如果你打算在编码和解码时,使用一些像RSA或者ECDSA的数字签名算法的话,你也需要安装cryptography库
pip install cryptography
- 如果你打算在编码和解码时,使用一些像RSA或者ECDSA的数字签名算法的话,你也需要安装cryptography库
传统依赖
- 一些环境,比如最常用的Google App Engine,不允许安装需要编译C扩展名的Python包,因此无法安装加密。如果你能安装加密,你应该忽略这个部分。
- 如果你正在部署一个应用程序到这些环境之一,你需要使用数字签名算法的传统实现。
pip install pycrypto ecdsa
- 一旦你已经安装了 pycrypto 和 ecdcsa,你可以在PyJWT中使用jwt.register_algorithm()。下面的示例代码将展示怎样配置PyJWT,去使用具有SHA256和EC与SHA256签名的RSA的传统实现。
import jwt from jwt.contrib.algorithms.pycrypto import RSAAlgorithm from jwt.contrib.algorithms.py_ecdsa import ECAlgorithm jwt.register_algorithm('RS256', RSAAlgorithm(RSAAlgorithm.SHA256)) jwt.register_algorithm('ES256', ECAlgorithm(ECAlgorithm.SHA256))
使用示例
- 编码&解码 令牌
>>import jwt
>>encoded = jwt.encode({'some': 'payload'}, 'secret', algorithm='HS256')
'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzb21lIjoicGF5bG9hZCJ9.4twFt5NiznN84AWoo1d7KO1T_yoc0Z6XOpOVswacPZg'
- 指定附加标题
>>jwt.encode({'some': 'payload'}, 'secret', algorithm='HS256', headers={'kid': '230498151c214b788dd97f22b85410a5'})
'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCIsImtpZCI6IjIzMDQ5ODE1MWMyMTRiNzg4ZGQ5N2YyMmI4NTQxMGE1In0.eyJzb21lIjoicGF5bG9hZCJ9.DogbDGmMHgA_bU05TAB-R6geQ2nMU2BRM-LnYEtefwg'
在没有验证的情况下,阅读声明集
如果打算阅读JWT的声明集,而不对签名或任何已注册的声明名称进行验证,则可以将verify参数设置为False。
注意:除非你清楚地了解你正在做什么,否则使用此功能通常是不明智的。 没有数字签名信息,声明集的完整性或真实性是不可信的。
>>jwt.decode(encoded, verify=False) {u'some': u'payload'}
已经注册的声明参数
- JWT特别定义了一些已经注册的声明参数,并且定义了它们怎样使用。PyJWT支持这些已经注册的声明参数:
“exp” (Expiration Time) Claim “nbf” (Not Before Time) Claim “iss” (Issuer) Claim “aud” (Audience) Claim “iat” (Issued At) Claim
- JWT特别定义了一些已经注册的声明参数,并且定义了它们怎样使用。PyJWT支持这些已经注册的声明参数:
- 过期时间声明(exp)
- “exp”(到期时间)声明标识JWT不得接受处理过期时间。 “exp”声明的处理要求:当前日期/时间必须在“exp”声明中列出的到期日/时间之前。 使用时可能会提供一些较小的余地,通常不超过几分钟来解决时钟偏差。 其值必须是包含NumericDate值的数字。 使用此声明是可选的。