带秘密的flask无状态身份验证

flask-stateless-auth的Python项目详细描述


Logo

Build StatusSoftware LicenseCode style: blackDownloadsMonthly Downloads

烧瓶无状态验证

一个轻量级的无电池,包括无状态认证扩展烧瓶。

功能

  • 烧瓶无状态身份验证有助于在烧瓶开发人员决定:

    • 无状态身份验证,不使用会话。
    • 不发布签名令牌,例如(jwt),而是发布要根据db或排序的数据存储进行验证的令牌。
  • flask stateless auth在使用token_required装饰器进行身份验证时,在请求上下文中存储当前的无状态用户变量。

  • 开发人员可以自由实施自己的授权方案,但是:

    • 典型的header_name是“授权”
    • 典型的auth_type是“承载者”
    • 典型的token是一个随机的b64编码字符串。
    • 典型的token_type是:访问或刷新令牌
  • 提供2个信号:

    1. user-authorized
    2. user-unauthorized

设置

$ pip install flask-stateless-auth

快速启动

# initializationsstateless_auth_manager=StatelessAuthManager()app=Flask(__name__.split('.')[0])# configsclassConfig:#TOKEN_TYPE = 'Bearer'         # Default#TOKEN_HEADER = 'Authorization'# Default#ADD_CONTEXT_PROCESSOR = True  # Default#DEFAULT_TOKEN_TYPE = 'access' # Default# modelsclassUser(UserMixin):def__init__(self,id,username):self.id=idself.username=usernameclassToken(TokenMixin):def__init__(self,user_id,access_token,refresh_token):self.user_id=user_idself.access_token=access_tokenself.refresh_token=refresh_token# dbusers=[User(1,'first_user'),User(2,'second_user')]tokens=[Token(1,'first_user_access_token','first_user_refresh_token'),Token(2,'second_user_access_token','second_user_refresh_token')]# First loader@stateless_auth_manager.token_loaderdeftoken_by(token,token_type,auth_type):''' where `token` is the token loaded from the header '''try:fortokenintokens:iftoken_type=='access'iftoken.access_token==token:returntokeneliftoken_type=='refresh':iftoken.refresh_token==token:returntokenraiseStatelessAuthError(msg='{} Invalid token'.format(token.type),code=401,type_='Token')exceptStatelessAuthError:raiseexceptExceptionase:log.critical(e)raiseStatelessAuthError(msg='internal server error',code=500,type_='Server')# Second loader@stateless_auth_manager.user_loaderdefuser_by_token(token):''' where `token` is the token model loaded from the token table '''try:foruserinusers:ifuser.id==token.id:returnuserexceptExceptionase:log.critical(e)raiseStatelessAuthError(msg='internal server error',code=500,type_='Server')log.critical('token: {} belongs to a user: {} but user wasn'tfound'.format(token.id, user.id))raiseStatelessAuthError(msg='internal server error',code=500,type_='Server')# Error handler@app.errorhandler(StatelessAuthError)defhandle_stateless_auth_error(error):returnjsonify({'error':error.full_msg}),error.code@app.route('/secret',methods=['GET'])@token_required(token_type='access',auth_type='Bearer')#access by defaultdefsecret():data={'secret':'Stateless auth is awesome :O'}returnjsonify(data),200@app.route('/whoami',methods=['GET'])@token_requireddefwhoami():data={'my_username':current_stateless_user.username}returnjsonify(data),200if__name__=='__main__':app.config.from_object(Config())stateless_auth_manager.init_app(app)app.run()
  • 有关更实际的示例,请查看:tests/app_example.pytests/test_app.py

重要说明:

  1. Flask无状态身份验证强制使用以下授权格式:

    • {"header_name": "auth_type" + " " + "token"}
  2. 烧瓶无状态身份验证需要2次回调才能正常工作:

    1. token_loader:应该从给定的模型加载一个令牌,atokentoken_typeauth_type
    2. user_loader:应该从模型中加载给定令牌的用户(从token_loader加载的令牌)
  3. Flask无状态身份验证还需要StatlesAutherror错误处理程序。处理程序将收到具有以下属性的错误:

    • error.code:建议的状态代码
    • error.msg:消息
    • error.type:错误类型('token','request','scope')
    • error.full_msg:错误消息+类型
    • 然后,开发人员可以通过控制要分发给api客户端的信息来决定如何分别处理每个错误。
  4. 建议在无法加载令牌或用户时引发无状态身份验证错误。但是,您仍然可以返回None,flaskstateauth将返回一个通用错误消息和代码。

  5. 令牌模型必须有一个is_expired()方法,该方法接受请求的auth_type(例如“承载者”)和token_type(例如“访问”或“刷新”)并返回布尔值。

  6. 用户模型必须具有返回布尔值的is_active属性。

  7. 如果不想实现点^ {CD26>}和^ {CD27>},那么可以简单地让令牌和用户模型从^ {< CD28 >}和^ {CD29 >}继承。

测试

$ tox

API

  • 无状态身份验证管理器
  • 无状态验证错误
  • 当前无状态用户
  • 需要令牌()
  • TukMixin UserMixin ><

联系方式

我目前是一名自由软件开发人员。喜欢我的工作给我找工作?

想全职雇用我吗?给我发邮件@omarryhan@gmail.com

给我买杯咖啡

比特币:3nmywnkr1lzo8gynxfunzvboziacpea31z

以太坊:0x1e1400c311cd813685fe0f6d29e0f91c1da4675ae

比特币现金:qqzn7rsav6hr3zqcp4829s48hvsvjat4zq7j42wkxd

litecoin:mb5m3ce3je4e8nwgcwofjlvgqjdqpyyejp

paypal:https://paypal.me/omarryhan

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

推荐PyPI第三方库


热门话题
java出现编译错误,我不理解   java在gnu-trove库中是否有任何有序映射?   java Servlet应该有映射,但找不到Servlet   java时间和第二期显示1:10,而不是13:10   java Play Framework 1.2.7 Heroku更新崩溃   线程“main”java中的opencsv异常。lang.NoClassDefFoundError:org/apache/commons/lang3/ObjectUtils   selenium在java中隐藏警告消息   java使用ID引用将JSON实体反序列化为POJO   java无法在JRE 8中加载字体   一个线程中的异常/错误会使整个应用程序停止吗?   java访问重复子规则的元素标签;e、 g.用ANTLR解析(1,2,3)中的a   java如何从平移旋转中找到新坐标   使用HTML Java小程序托管jar文件存在安全问题   java如何按频率而不是字母顺序排列字符串数组   java清除bufferedReader和块以获得更多输入   java解密SAML2断言