用于熔融web框架的json web令牌库

molten-jwt的Python项目详细描述


熔融jwt

PyPIPyPIBuild Statuscodecov

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

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

推荐PyPI第三方库


热门话题
java如何在jprogressbar上添加文本?   java生成30到32位之间的随机数   我想从我自己的服务器而不是java worldwind中的nasa服务器获取数据   jsp中带有外部java文件的html计数器   java如何找到运行Servlet的主机和端口   我怎么能看到数学。java中的cos方法计算平方根?   java这个docker run命令做什么?   java如何在将表单提交到servlet后将原始JSP保存在URL中?   如何在Java中访问Arraylist中的字典数据?   java JPA如果我有一个实体被用作复合键,那么级联是否也构成复合键的一部分?   连接Java:文件读取/添加到文件程序时未按预期工作(逻辑错误)   java从Android向PLC发送布尔值   java Get build。gradle文件作为一个。类文件   Youtube API V3 Java无需调用浏览器即可上传视频   java如何在Unittest中测试StackOverflower错误   实现方法中的java异常处理   java这个::instanceMethod在java8中用作方法参数有什么用途   java偶尔会获得javax。邮政使用javamail阅读gmail电子邮件时的FolderClosedException