用于熔融web框架的json web令牌库
molten-jwt的Python项目详细描述
熔融jwt
json web令牌(jwt)库,构建在Authlib之上,用于Moltenweb框架。
用法
Jwt
JWT
类提供了在应用程序或中间件中编码和解码json web令牌的核心方法。根据json web签名(jws)规范,所有生成的令牌都使用密钥和算法进行签名。
note:对令牌签名并不意味着对令牌内容进行加密。此签名用于防止篡改。注意不要在未加密的令牌中公开私有信息。另外,请始终使用传输级安全(TLS)
frommolten_jwtimportJWTjwt=JWT(key='asecretkeyforsigning',alg="HS256")token=jwt.encode({'sub':'superman'})decoded=jwt.decode(token)
依赖注入的jwt
向熔融应用程序注册JWTComponent
,并在熔融应用程序中提供JWT_SECRET_KEY
。使用SettingsComponent
为您的JWT
可注入实例提供配置。现在只需用JWT
类型注释您的a handler参数,并使用它对json web令牌进行编码。
fromtypingimportDictfrommoltenimport(App,Route,Settings,SettingsComponent,schema,field,HTTP_403,HTTP_500,)frommolten.errorsimportHTTPErrorfrommolten_jwtimportJWT,JWTComponentsettings=Settings({"JWT_SECRET_KEY":"donotcommittoversioncontrol"})@schemaclassUserData:email:strpassword:str=field(request_only=True)defdb_login(data:UserData):# DB magic happens here. This is just to have a working example for copy pastasetattr(data,"id",1)returndatadeflogin(data:UserData,jwt:JWT)->Dict:# Perform the authentication task with your data layeruser=db_login(data)ifnotuser:raiseHTTPError(HTTP_403,"Incorrect username or password")payload={"sub":user.id,"name":user.email,"other_data":"12345"}try:token=jwt.encode(payload)exceptException:raiseHTTPError(HTTP_500,"Internal error encountered")return{"token":token}components=[SettingsComponent(settings),JWTComponent()]routes=[Route("/login",login,method="POST")]app=App(routes=routes,components=components)
Jwtidentity
可以将JWTIdentity
组件添加到应用程序中,以从解码的访问令牌提供用户表示。默认情况下,此库假定您的访问令牌是在请求的Authorization
头中发送的。或者,可以在设置中使用JWT_AUTH_COOKIE
提供cookie名称,但是当前功能不支持这两种方法。将JWTIdentityComponent
添加到应用程序的组件列表中,然后将JWTIdentity
注入到处理程序中。如果找不到Authorization
头/cookie,或者在对令牌解码时发生错误,JWTIdentityComponent
将返回None
。
...frommolten_jwtimportJWT,JWTIdentity,JWTComponent,JWTIdentityComponent...defprotected_endpoint(jwt_user:JWTIdentity)->Dict:ifjwt_userisNone:raiseHTTPError(HTTP_403,"Forbidden")return{"user_id":jwt_user.id,"name":jwt_user.user_name,"token":jwt_user.token}components=[SettingsComponent(settings),JWTComponent(),JWTIdentityComponent()]routes=[Route("/login",login,method="POST"),Route("/safe",protected_endpoint,method="GET"),]app=App(routes=routes,components=components)
jwtauthMiddleware
可以将JWTAuthMiddleware
添加到应用程序中,以全局验证是否在请求的Authorization
头或命名cookie中传递了json web令牌。此中间件取决于molten.Settings
组件、molten_jwt.JWT
组件和molten_jwt.JWTIdentity
组件的可用性。
使用此中间件时,使用molten_jwt.decorators.allow_anonymous
装饰符允许对终结点进行未经身份验证的访问。或者,可以使用JWT_AUTH_WHITELIST
设置来提供应跳过身份验证检查的处理程序名称列表。
fromtypingimportDictfrommoltenimport(App,Route,Settings,SettingsComponent,schema,field,HTTP_403,HTTP_500,ResponseRendererMiddleware,)frommolten.errorsimportHTTPErrorfrommolten_jwtimportJWT,JWTIdentity,JWTComponent,JWTIdentityComponent,JWTAuthMiddlewarefrommolten_jwt.decoratorsimportallow_anonymoussettings=Settings({"JWT_SECRET":"donotcommittoversioncontrol"})@schemaclassUserData:email:strpassword:str=field(request_only=True)defdb_login(data:UserData):# DB magic happens here this is just to have a working examplesetattr(data,"id",1)returndata@allow_anonymousdeflogin(data:UserData,jwt:JWT)->Dict:# Perform the authentication task with your data layeruser=db_login(data)ifnotuser:raiseHTTPError(HTTP_403,"Incorrect username or password")payload={"sub":user.id,"name":user.email,"other_data":"12345"}try:token=jwt.encode(payload)exceptException:raiseHTTPError(HTTP_500,"Interal error encountered")return{"token":token}defprotected_endpoint(jwt_user:JWTIdentity)->Dict:"""Will raise a 401 HTTP status if a JWT is not present or is invalid"""return{"user_id":jwt_user.id,"name":jwt_user.user_name,"token":jwt_user.token}@allow_anonymousdefanonymous_ok(jwt_user:JWTIdentity)->Dict:ifjwt_userisNone:return{"message":"JWT token not presented or is invalid. Accessing resource as anonymous."}return{"user_id":jwt_user.id,"name":jwt_user.user_name,"token":jwt_user.token}components=[SettingsComponent(settings),JWTComponent(),JWTIdentityComponent()]middleware=[ResponseRendererMiddleware(),JWTAuthMiddleware()]routes=[Route("/login",login,method="POST"),Route("/safe",protected_endpoint,method="GET"),Route("/anyone",anonymous_ok,method="GET"),]app=App(routes=routes,components=components,middleware=middleware)
归因
非常感谢apistar-jwt为这个包提供了灵感和起点。
历史记录
0.2.1变更/固定
- 修复了readme.md代码示例
- 由于authlib 0.11中的api更改而固定的authlib版本
0.2.0更改/添加/固定
JWTUser
现在称为JWTIdentity
JWTIdentity
现在可以通过标准点表示法对其令牌声明进行动态属性访问- 身份验证代码和组件已重新定位到
molten_jwt.auth
JWT
现在是authlib.jwt
的简单包装,不依赖于molten.Settings
。JWTComponent
将返回根据molten.Settings
中传递的设置配置的单个jwt实例JWTIdentityComponent
现在有一个设置,可以从传入命名cookie的json web令牌中提取jwtdentity。JWTAuthMiddleware
现在有了控制身份验证检查的新设置,包括处理程序的白名单。
0.1.1添加/固定
- 在推送到pypi之前更新了文档
- 修复了bumpversion替换字符串
0.1.0变化
从使用pyjwt切换到authlib以支持jwt