一个用于api star的json web令牌组件

apistar_jwt的Python项目详细描述


APISTAR JWT

pypitraviscodecov

json web令牌组件,用于api star>;=0.4

安装

$ pip install apistar-jwt

或者,通过pipenv安装。

$ pipenv install apistar-jwt

用法

向apistar应用程序注册JWT组件。

fromapistarimportAppfromapistar_jwt.tokenimportJWTroutes=[# ...]components=[JWT({'JWT_SECRET':'BZz4bHXYQD?g9YN2UksRn7*r3P(eo]P,Rt8NCWKs6VP34qmTL#8f&ruD^TtG',}),]app=App(routes=routes,components=components)

在登录函数中注入JWT组件,并使用它对jwt进行编码。

fromapistarimportexceptions,types,validatorsfromapistar_jwt.tokenimportJWTclassUserData(types.Type):email=validators.String()password=validators.String()deflogin(data:UserData,jwt:JWT)->dict:# do some check with your database here to see if the user is authenticateduser=db_login(data)ifnotuser:raiseexceptions.Forbidden('Incorrect username or password.')payload={'id':user.id,'username':user.email,'random_data':'102310',}token=jwt.encode(payload)iftokenisNone:# encoding failed, handle errorraiseexceptions.BadRequest()return{'token':token}

JWTUser组件注入到您希望使用所提供jwt进行身份验证的任何资源中。

fromapistar_jwt.tokenimportJWTUserdefwelcome(user:JWTUser)->dict:message=f'Welcome {user.username}#{user.id}, here is your random data: {user.token["random_data"]}'return{'message':message}

注释

使用jwt发出的请求在向资源发出的请求中,必须使用Bearer方案将令牌作为Authorization头传递。

$ curl -i -H "Accept: application/json" -H "Content-Type: application/json" -H "Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VyIjoxfQ.fCqeAJGHYwZ9y-hJ3CKUWPiENOM0xtGsMeUWmIq4o8Q" http://localhost:8080/some-resource-requiring-jwt-auth

装饰师

我们提供了两个装饰器,以方便强制执行所需的身份验证或允许匿名用户使用路由:

fromapistar_jwt.tokenimportJWTUserfromapistar_jwt.decoratorsimportanonymous_allowed,authentication_required@authentication_requireddefauth_required(request:http.Request,user:JWTUser):returnuser.__dict__@anonymous_alloweddefanon_allowed(request:http.Request,user:JWTUser):ifuser:returnuser.__dict__returnNone

装饰器将强制用户登录该路由。同时@anonymous_allowed将设置user: JWTUser=None,并允许匿名用户访问路由。默认行为是@authentication_required,因此您不需要用这个装饰符进行注释,它只是帮助您的代码显式。

设置

这个包使用两个设置来标识jwt负载中的usernameuser_id键,它们默认为:

{'JWT_USER_ID':'id','JWT_USER_NAME':'username',}

如果JWT使用其他类型的键,则在实例化组件时重写这些键:

fromapistar_jwt.tokenimportJWTcomponents=[JWT({'JWT_USER_ID':'pk','JWT_USER_NAME':'email',})]

JWT_WHITE_LIST允许您指定不需要jwt身份验证的路由函数列表。如果您设置了默认的身份验证策略,但希望打开某些路由,特别是可能在第三方包或apistar本身(如模式文档)中的路由,则这非常有用。

fromapistar_jwt.tokenimportJWTcomponents=[JWT({'JWT_WHITE_LIST':['serve_schema','home'],})]

在本例中,serve_schemahome路由不需要jwt身份验证。

JWT_ALGORITHMS与用于解码jwts的算法有关。默认情况下,我们只使用'hs256',但是jwt支持传递一个supported algorithms数组,它将在尝试解码时按顺序尝试该数组。

fromapistar_jwt.tokenimportJWTcomponents=[JWT({'JWT_ALGORITHMS':['HS256','RSA512'],})]

JWT_SECRET是一个很长的随机密钥,不应该签入版本控制。

fromapistar_jwt.tokenimportJWTcomponents=[JWT({'JWT_SECRET':'QXp4Z83.%2F@JBiaPZ8T9YDwoasn[dn)cZ=fE}KqHMJPNka3QyPNq^KnMqL$oCsU9BC?.f9,oF2.2t4oN?[g%iq89(+'})]

对于所有其他设置,请使用JWT_OPTIONS键,在解码时,该键会将它们传递给底层的PyJWT库。

fromapistar_jwt.tokenimportJWTcomponents=[JWT({'JWT_OPTIONS':{'issuer':'urn:foo','audience':'urn:bar','leeway':10,},})]

快速列出选项:

audience是此应用程序访问群体的urn,它必须与负载的aud键中的值匹配。Read more about audience claim

issuer是发出令牌的应用程序的urn,它必须与有效负载的iss键中的值匹配。Read more about the issuer claim

leeway是过去过期时间声明仍然有效的边距秒数。

完全定制的JWT组件需要如下:

fromapistar_jwt.tokenimportJWTcomponents=[JWT({'JWT_ALGORITHMS':['HS256','RSA512'],'JWT_USER_ID':'pk','JWT_USER_NAME':'email','JWT_SECRET':'QXp4Z83.%2F@JBiaPZ8T9YDwoasn[dn)cZ=fE}KqHMJPNka3QyPNq^KnMqL$oCsU9BC?.f9,oF2.2t4oN?[g%iq89(+','JWT_OPTIONS':{'issuer':'urn:foo','audience':'urn:bar','leeway':10,},'JWT_WHITE_LIST':['serve_schema'],})]

开发

此项目使用^{}来管理其开发环境,并使用^{}作为其测试运行程序。要安装开发依赖项:

pipenv install --dev

运行测试:

pipenv shell
pytest

此项目使用Codecov强制所有请求的代码覆盖率。要在本地运行测试并输出代码覆盖率报告,请运行:

pipenv shell
pytest --cov=apistar_test/

历史记录

0.4.2

  • 现在一切都是顶级导出,例如from apistar_jwt import JWT(谢谢@jgiradet)

0.4.1

  • 添加了装饰器支持,@anonymous_allowed@authentication_required
  • 重新添加到测试套件中
  • 更新了类型并修复了实例化JWT组件的错误

0.4.0**断裂变化**

APISTAR JWT已更新,支持APISTAR>;=0.4。对于APISTAR 0.3.x支架,固定到0.3.3

0.3.3

更新dev-deps,以便我们为pypi使用元数据2.1规范。

0.3.2

更新apistar 0.3.x的pin依赖项,并将降价渲染添加到pypi.org

0.3.1

为Apistar 0.3.x发布

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java如何让用户决定按钮的特定颜色   java Tomcat jdbc连接池,使用后不释放连接   Java泛型类可分配性   javaactivemq&如何在路由路径中创建依赖关系   java为什么没有接收到操作用户?   windows如何启动使用cmd中预编译DLL的java swing应用程序?   java JFreechart实时组合图,在未收到数据点的情况下呈现step子图表的上一个值   java排序自定义数组列表   java如何从HSLFSlideShow获取文本格式信息   java不能将片段和活动登录结合起来   java是下载位于远程存储服务中的文件的有效方法   java AS:将点数交给GameOverActivity   java如何在textView中将焦点放在新生成文本的顶部?   HashMap中特定于Java存储的类类型   java使用不同的变量类型进行计算   if语句中的Java poll()   检查匹配括号的java字符堆栈没有错误,但也没有任何作用   java Netbeans不断将应用程序部署到错误的服务器