自定义flask-security的@auth_token_required未经授权的响应

时间:2015-12-23 02:56:17

标签: python flask flask-security

我第一次尝试烧瓶,我正在尝试使用基于令牌的身份验证创建一个rest api。

一切都很顺利,除了我无法自定义@auth_token_required返回的未经授权的响应,这是默认消息:

  

未经授权

     

服务器无法验证您是否有权访问该URL   请求。你要么提供了错误的凭证(例如坏的   密码),或者您的浏览器不明白如何提供   需要凭证。

我希望它返回一个json响应,可能看起来像:

{
    "code": 401,
    "message": "Unauthorized message"
}

到目前为止,我已尝试使用以下内容覆盖unauthorized_handler

@app.login_manager.unauthorized_handler
def unauthorized():
    // code goes here

但它似乎不适用于@auth_token_required装饰器。

3 个答案:

答案 0 :(得分:1)

请参阅pip的响应,Flask Security在内部使用flask登录来实现其回调。当我们使用Flask安全性注册回调处理程序时,我们得到调用堆栈超出响应。

<强> app.security.unauthorized_handler(unauth_handler)

因此请注册Flask登录

<强> app.login_manager.unauthorized_handler(unauth_handler)

希望这有帮助。

答案 1 :(得分:0)

这是我的代码;它似乎工作!

import json

from flask import Reponse


def unauth_handler():
    return Response(json.dumps({'unauthorized': True}), 401)

app.security.unauthorized_handler(unauth_handler)

以下是一个更完整的例子,说明如果与下面的错误有关,请调用它。

def setup_app(app):
    config(app)

    # database init, allows the DB to be available in core but setup per application.
    db.init_app(app)

    # bcrypt, again available from core.
    bcrypt.init_app(app)

    # setup assets
    app.assets_env = Environment(app)

    # login system
    app.user_datastore = SQLAlchemyUserDatastore(db, User, Role)
    app.security = security.init_app(app, app.user_datastore)

    def unauth_handler():
        return Response(ejson.dumps({'unauthorized': True}), 401)

    app.security.unauthorized_handler(unauth_handler)

    logger(app)
    jinja_filters(app)
    assets(app)
    modules(app)

然后我将应用程序传入init中的setup函数。

答案 2 :(得分:0)

更新以上答案

from flask import response, jsonify
from flask_security.decorators import _get_unauthorized_response

user_datastore = SQLAlchemyUserDatastore(db, User, Role)
security = Security()
security_state = security.init_app(app, user_datastore)

def unauth_handler():
    if request.is_json:
        return jsonify({'status': False, 'message': 'Unauthorized!'}), 401, {'Content-Type': 'application/json'}
    else:
        return _get_unauthorized_response()

security_state.unauthorized_handler(unauth_handler)