使用python的超级简单json web令牌
easyjwt的Python项目详细描述
容易jwt
<<
easyjwt提供了一个简单的接口来创建和验证 python中的json web令牌(jwts)。它允许您定义 jwt,然后创建并接受带有这些声明的令牌,而不必检查是否给出了所有必需的数据 或者如果代币是您所期望的代币。
啊!功能
- 将令牌声明定义为一个类,然后使用该类轻松创建和验证多个令牌。
- 不用担心字典键中的拼写错误:声明集的类定义使ide能够找到那些 你的打字错误。 多个令牌可能具有相同的声明,但意图不同。easyjwt会帮你处理的:你可以 定义一个用于帐户验证的令牌和一个用于帐户删除的令牌,都将帐户ID作为声明,并且 不必担心意外删除新创建的帐户而不是验证它,因为 有人把代币弄混了。 如果缺少强制声明或包含意外声明,令牌将被拒绝。
- 您可以为令牌定义可选声明。
- 支持所有注册的JWT索赔:
aud
,exp
,iat
,iss
,jti
,nbf
和sub
。
系统要求和安装
easyjwt需要python 3.6或更新版本。
在pypi上可以使用easyjwt。你可以用你最喜欢的软件包安装它 经理。
管道:
啊!管道编号:
啊!
用法
在创建令牌之前,需要定义令牌将拥有的声明。您可以通过创建令牌来完成此操作
从easyjwt
继承的类。在其u init
方法中,您只需定义
属性和声明的名称。easyjwt将把所有属性都视为声明,除非它们以
下划线u
。记住调用父类上的uu init
方法来正确初始化
类,
create
方法。token_object=MySuperSimpleJWT('Super secret key')token_object.name='Zaphod Beeblebrox'token_object.email='elprez@universe.gov'token=token_object.create()
如果忘记设置索赔的值,则创建将失败,并显示missingRequiredClaimsRor
例外情况(有关如何定义可选索赔的信息,请参见下文)。
一旦您收到要验证的令牌,您只需将其和用其编码的密钥传递给easyjwt的verify
方法。如果令牌有效,则返回的对象将包含令牌的值。
verified_token_object=MySuperSimpleJWT.verify(token,'Super secret key')assertverified_token_object.name=='Zaphod Beeblebrox'assertverified_token_object.email=='elprez@universe.gov'
如果您尝试验证缺少令牌类中指定的一个或多个声明的令牌,或者它包含一个
或者更多声明没有在令牌类中指定,验证将通过引发
无效的claimseterror
异常。因此,您总是知道您期望令牌中的数据实际上会存在。
easyjwt的好处是:它知道用哪个类创建了一个令牌,并且只有在它们 已经用您试图验证它的类创建(请参见下文 有关详细信息以及如何禁用此行为)。因此,可以有多个具有相同声明的令牌类, 但不同的背景,你不必担心混淆他们的代币!
fromeasyjwtimportEasyJWTclassAccountValidationToken(EasyJWT):""" Validate the newly created user account with the specified ID. """def__init__(self,key):super().__init__(key)self.user_id=NoneclassAccountDeletionToken(EasyJWT):""" Delete the user account with the specified ID. """def__init__(self,key):super().__init__(key)self.user_id=Nonevalidation_token_object=AccountValidationToken('Super secret key')validation_token_object.user_id=42validation_token=validation_token_object.create()# Verifying the validation token with the deletion token class will fail!# AccountDeletionToken.verify(validation_token, 'Super secret key')
如果试图用错误的类验证令牌,easyjwt将通过引发
无效类错误
异常。
接受第三方代币
默认情况下,easyjwt将只接受您用以验证的类创建的令牌 它是。 通过在创建时在令牌中包含特殊声明来完成。验证令牌时需要此声明。令牌 如果没有此声明或此声明的值错误,则将无法验证。通常,来自其他来源的令牌 不包括此声明,因此此类令牌的验证将失败。
通过在令牌类中设置特殊标志,可以禁用此特殊声明的验证。这面旗子会 还要防止特殊声明包含在创建的令牌中。
fromeasyjwtimportEasyJWTclassThirdPartyJWT(EasyJWT):# Disable the validation of the special claim.strict_verification=False# The usual definition of the token's claim set ...
如果您尝试在没有此特殊声明且没有禁用严格验证模式的情况下验证令牌,则easyjwt
将引发一个未指定的类错误
异常。
< Buff行情>
[1]:准确地说,创建令牌的类的名称必须 与正在验证的类的名称相同。这个类名包含在每个令牌中 由easyjwt在特殊索赔中创建
编码算法
easyjwt创建的令牌在默认情况下使用hs256算法进行编码。如果你想用不同的算法, 您可以在令牌类的定义中指定此算法。
fromeasyjwtimportAlgorithmfromeasyjwtimportEasyJWTclassMySuperSimpleJWT(EasyJWT):# Use the HS512 algorithm.algorithm=Algorithm.HS512# The usual definition of the token's claim set ...
如果您以前用token类创建了令牌,以后想更改新令牌的算法, 您应该告诉easyjwt仍然使用以前的算法来解码令牌。否则,使用旧的 无法验证您的代码版本!
fromeasyjwtimportEasyJWT# Define the claims of your token.classMySuperSimpleJWT(EasyJWT):def__init__(self,key):super().__init__(key)# Define a claim `name`.self.name=None# Create a token with some values.token_object=MySuperSimpleJWT('Super secret key')token_object.name='Zaphod Beeblebrox'token=token_object.create()# Verify the created token.verified_token_object=MySuperSimpleJWT.verify(token,'Super secret key')assertverified_token_object.name=='Zaphod Beeblebrox'0
您可以在 API文档
可选声明
您在token类的\u init\u
方法中指定的所有声明都是必需的,这两个声明都用于创建此
类和用于验证令牌。如果您希望其中一些声明是可选的(用于创建和验证
令牌),您可以覆盖easyjwt的可选声明可信赖的您可以在令牌中重写这个类变量
类以包含可选声明的名称。请注意,您必须包含easyjwt.\u optional\u声明的值
在你们班上。否则,注册的索赔将成为强制性的。
fromeasyjwtimportEasyJWT# Define the claims of your token.classMySuperSimpleJWT(EasyJWT):def__init__(self,key):super().__init__(key)# Define a claim `name`.self.name=None# Create a token with some values.token_object=MySuperSimpleJWT('Super secret key')token_object.name='Zaphod Beeblebrox'token=token_object.create()# Verify the created token.verified_token_object=MySuperSimpleJWT.verify(token,'Super secret key')assertverified_token_object.name=='Zaphod Beeblebrox'1
注册索赔
easyjwt支持jwt规范的所有注册声明:aud
,exp
,iat
,iss
,jti
,nbf
和sub
。
所有这些声明都是可选的。
观众:aud
访问群体标识令牌的接收者,可以是字符串或字符串列表。
您可以使用令牌对象的属性audience
为令牌设置访问群体。这个属性将
创建令牌时自动映射到aud
声明。
fromeasyjwtimportEasyJWT# Define the claims of your token.classMySuperSimpleJWT(EasyJWT):def__init__(self,key):super().__init__(key)# Define a claim `name`.self.name=None# Create a token with some values.token_object=MySuperSimpleJWT('Super secret key')token_object.name='Zaphod Beeblebrox'token=token_object.create()# Verify the created token.verified_token_object=MySuperSimpleJWT.verify(token,'Super secret key')assertverified_token_object.name=='Zaphod Beeblebrox'2
要使用访问群体验证令牌,必须将至少一个访问群体值传递给easyjwt的verify
方法。
否则,验证将失败,并出现invalidaudienceerror
异常。经过验证,令牌是
访问群体将设置在访问群体
属性上。
fromeasyjwtimportEasyJWT# Define the claims of your token.classMySuperSimpleJWT(EasyJWT):def__init__(self,key):super().__init__(key)# Define a claim `name`.self.name=None# Create a token with some values.token_object=MySuperSimpleJWT('Super secret key')token_object.name='Zaphod Beeblebrox'token=token_object.create()# Verify the created token.verified_token_object=MySuperSimpleJWT.verify(token,'Super secret key')assertverified_token_object.name=='Zaphod Beeblebrox'3
有效期:exp
过期日期指定令牌有效的时间。如果具有到期日期的令牌在其 过期日期已过,令牌将无效。
您可以使用属性expiration_date
将令牌的到期日期设置为datetime
对象。这个
创建令牌时,属性将自动映射到exp
声明。请注意,必须指定
UTC格式的到期日。
fromeasyjwtimportEasyJWT# Define the claims of your token.classMySuperSimpleJWT(EasyJWT):def__init__(self,key):super().__init__(key)# Define a claim `name`.self.name=None# Create a token with some values.token_object=MySuperSimpleJWT('Super secret key')token_object.name='Zaphod Beeblebrox'token=token_object.create()# Verify the created token.verified_token_object=MySuperSimpleJWT.verify(token,'Super secret key')assertverified_token_object.name=='Zaphod Beeblebrox'4
当使用到期日期验证令牌时,easyjwt会自动检查到期日期是否已过。如果这样
在这种情况下,验证将失败,并出现expiredtokenerror
异常。经过验证,令牌是
过期日期将在UTC中的过期日期
属性上设置为日期时间
对象。
发布时间:IAT
颁发日期指定令牌的创建时间。
创建令牌时,此声明将自动设置为当前时间。如果你想改变
发布日期,您可以将datetime
对象(在UTC中)传递给easyjwt的create
方法:
fromeasyjwtimportEasyJWT# Define the claims of your token.classMySuperSimpleJWT(EasyJWT):def__init__(self,key):super().__init__(key)# Define a claim `name`.self.name=None# Create a token with some values.token_object=MySuperSimpleJWT('Super secret key')token_object.name='Zaphod Beeblebrox'token=token_object.create()# Verify the created token.verified_token_object=MySuperSimpleJWT.verify(token,'Super secret key')assertverified_token_object.name=='Zaphod Beeblebrox'5
使用"颁发日期"验证令牌后,其"颁发日期"将在"颁发日期"属性上设置。
发行人:iss
颁发者标识令牌的创建者。
您可以使用token对象的issuer
属性设置令牌的颁发者。这个属性将
创建令牌时自动映射到iss
声明。
fromeasyjwtimportEasyJWT# Define the claims of your token.classMySuperSimpleJWT(EasyJWT):def__init__(self,key):super().__init__(key)# Define a claim `name`.self.name=None# Create a token with some values.token_object=MySuperSimpleJWT('Super secret key')token_object.name='Zaphod Beeblebrox'token=token_object.create()# Verify the created token.verified_token_object=MySuperSimpleJWT.verify(token,'Super secret key')assertverified_token_object.name=='Zaphod Beeblebrox'6
要使用颁发者验证令牌,必须将令牌中指定的颁发者传递给easyjwt的verify
方法。
否则,验证将失败,并出现异常。验证后,令牌的颁发者
将在issuer
属性上设置。
fromeasyjwtimportEasyJWT# Define the claims of your token.classMySuperSimpleJWT(EasyJWT):def__init__(self,key):super().__init__(key)# Define a claim `name`.self.name=None# Create a token with some values.token_object=MySuperSimpleJWT('Super secret key')token_object.name='Zaphod Beeblebrox'token=token_object.create()# Verify the created token.verified_token_object=MySuperSimpleJWT.verify(token,'Super secret key')assertverified_token_object.name=='Zaphod Beeblebrox'7
jwt id:jti
jwt id是令牌的标识符。每个令牌都必须是唯一的。
您可以使用token对象的jwt_id
属性设置令牌的jwt id。这个属性将
创建令牌时自动映射到jti
声明
fromeasyjwtimportEasyJWT# Define the claims of your token.classMySuperSimpleJWT(EasyJWT):def__init__(self,key):super().__init__(key)# Define a claim `name`.self.name=None# Create a token with some values.token_object=MySuperSimpleJWT('Super secret key')token_object.name='Zaphod Beeblebrox'token=token_object.create()# Verify the created token.verified_token_object=MySuperSimpleJWT.verify(token,'Super secret key')assertverified_token_object.name=='Zaphod Beeblebrox'8
使用jwt id验证令牌后,将在jwt id属性上设置此id。
请注意,easyjwt没有核实这一索赔。您有责任在验证令牌之后验证它,如果 您需要此验证。
不早于:nbf
not before日期指定令牌无效的时间。如果一个带n的代币日期之前的OT是 在到达"不早于"日期之前验证,令牌将无效。
您可以使用datetime对象的属性not_before_date
为令牌设置不早于日期。这个属性
将在创建令牌时自动映射到nbf
声明。请注意,必须指定不早于日期
在UTC中,
fromeasyjwtimportEasyJWT# Define the claims of your token.classMySuperSimpleJWT(EasyJWT):def__init__(self,key):super().__init__(key)# Define a claim `name`.self.name=None# Create a token with some values.token_object=MySuperSimpleJWT('Super secret key')token_object.name='Zaphod Beeblebrox'token=token_object.create()# Verify the created token.verified_token_object=MySuperSimpleJWT.verify(token,'Super secret key')assertverified_token_object.name=='Zaphod Beeblebrox'9
当使用非早于日期验证令牌时,easyjwt会自动检查是否已达到非早于日期。如果
情况并非如此,验证将失败,并出现UnmatureTokenerror
异常。在核实之后,
token's not before date将在UTC中的not\u before\u date
属性上设置为datetime
对象。
主题:sub
主题指定令牌的主题。
您可以使用令牌对象的subject
属性设置令牌的主题。这个属性将
创建令牌时自动映射到子声明。
python -m pip install easyjwt0
使用主题验证令牌后,将在主题
属性上设置此主题。
请注意,easyjwt没有核实这一索赔。您有责任在验证令牌之后验证它,如果 您需要此验证。
未来想法
- 允许在没有颁发日期的情况下创建令牌。
- 添加模式以接受任意声明,并根据需要创建相应的属性。
- 允许指定函数在创建令牌之前和验证令牌之后打包和解包声明值, 分别。
致谢
easyjwt只是josépadilla的一个简单易用的抽象层,它位于pyjwt库周围。 它完成了根据jwt规范创建和验证令牌的实际工作。没有他的工作, 不可能轻松工作。
许可证
easyjwt由bastian meyer开发 <;bastian@bastianmeyer.eu>;并根据 麻省理工学院许可证。有关详细信息,请参见附加的许可证文件。