带秘密的flask无状态身份验证
flask-stateless-auth的Python项目详细描述
烧瓶无状态验证
一个轻量级的无电池,包括无状态认证扩展烧瓶。
功能
烧瓶无状态身份验证有助于在烧瓶开发人员决定:
- 无状态身份验证,不使用会话。
- 不发布签名令牌,例如(jwt),而是发布要根据db或排序的数据存储进行验证的令牌。
flask stateless auth在使用
token_required
装饰器进行身份验证时,在请求上下文中存储当前的无状态用户变量。开发人员可以自由实施自己的授权方案,但是:
- 典型的
header_name
是“授权” - 典型的
auth_type
是“承载者” - 典型的
token
是一个随机的b64编码字符串。 - 典型的
token_type
是:访问或刷新令牌
- 典型的
提供2个信号:
user-authorized
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.py
和tests/test_app.py
。
重要说明:
Flask无状态身份验证强制使用以下授权格式:
{"header_name": "auth_type" + " " + "token"}
烧瓶无状态身份验证需要2次回调才能正常工作:
token_loader
:应该从给定的模型加载一个令牌,atoken
、token_type
和auth_type
user_loader
:应该从模型中加载给定令牌的用户(从token_loader
加载的令牌)
Flask无状态身份验证还需要StatlesAutherror错误处理程序。处理程序将收到具有以下属性的错误:
error.code
:建议的状态代码error.msg
:消息error.type
:错误类型('token','request','scope')error.full_msg
:错误消息+类型- 然后,开发人员可以通过控制要分发给api客户端的信息来决定如何分别处理每个错误。
建议在无法加载令牌或用户时引发无状态身份验证错误。但是,您仍然可以返回
None
,flaskstateauth将返回一个通用错误消息和代码。令牌模型必须有一个
is_expired()
方法,该方法接受请求的auth_type
(例如“承载者”)和token_type
(例如“访问”或“刷新”)并返回布尔值。用户模型必须具有返回布尔值的
is_active
属性。如果不想实现点^ {CD26>}和^ {CD27>},那么可以简单地让令牌和用户模型从^ {< CD28 >}和^ {CD29 >}继承。
测试
$ tox
API
- 无状态身份验证管理器
- 无状态验证错误
- 当前无状态用户
- 需要令牌() TukMixin UserMixin ><
联系方式
我目前是一名自由软件开发人员。喜欢我的工作给我找工作?
想全职雇用我吗?给我发邮件@omarryhan@gmail.com
给我买杯咖啡
比特币:3nmywnkr1lzo8gynxfunzvboziacpea31z
以太坊:0x1e1400c311cd813685fe0f6d29e0f91c1da4675ae
比特币现金:qqzn7rsav6hr3zqcp4829s48hvsvjat4zq7j42wkxd
litecoin:mb5m3ce3je4e8nwgcwofjlvgqjdqpyyejp
paypal:https://paypal.me/omarryhan