我第一次尝试烧瓶,我正在尝试使用基于令牌的身份验证创建一个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
装饰器。
答案 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)