一个用于api star的json web令牌组件
apistar_jwt的Python项目详细描述
APISTAR JWT
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负载中的username
和user_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_schema
和home
路由不需要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发布