【问题标题】:Flask, flask-jwt-extended - trying to custom handle Unauthorized errorFlask,flask-jwt-extended - 尝试自定义处理未经授权的错误
【发布时间】:2021-10-27 12:15:58
【问题描述】:

我正在构建一个烧瓶 webapp,并且我试图返回自定义错误消息,以防出现 401 错误,该错误在缺少 auth 标头时引发。对于身份验证,我使用 Flask-Jwt-Extended。我想覆盖 expired_token_loader(callback) 以返回 401 错误,然后使用 @app.errohandler(401) 捕获它并重定向到登录。
到目前为止,我已经这样做了:

@jwt.unauthorized_loader
def unauthorized_callback(callback):
    # Missing auth header
    # abort(401)
    return make_response("", 401)

@app.errorhandler(401)
def unauthorized(e):
    return "Custom 401 Error", 401

在官方 Flask-JWT-Extended 文档中发现用@jwt.unauthorized_loader 装饰的函数必须返回一个 Flask 响应。

因此,当我尝试abort(401) 如上所示并且不从unaturhorized_callback() 返回任何内容时,它显示werkzeug.exceptions.Unauthorized: 401 Unauthorized: ...

当我return make_response("", 401) 显示这个时,这意味着错误处理程序没有处理错误:


编辑:我正在尝试重定向 @jwt.unauthorized_loader 的触发器,所以我想抛出一个 401 错误,然后用例如 @app.errorhandler(401) 捕获它并重定向。
我这样做是因为我还在构建一个 移动应用程序,我在其中遇到 401 错误,当我在 @jwt.unauthorized_loader 内重定向时,它始终是错误 302,否则重定向将不起作用.所以我不能做make_response(redirect("/login"), 401)所以我的目标是抛出 401 错误,然后在网络应用和移动应用中以不同的方式处理它。谢谢你的帮助。

【问题讨论】:

    标签: python flask werkzeug flask-jwt-extended


    【解决方案1】:

    不完全是我想要的,但最终它满足了我的需求。使用自定义 http 响应代码进行重定向,我使用 401 代码执行 render_template,如下所示:

    @jwt.unauthorized_loader
    def unauthorized_callback(callback):
        # Missing auth header
        flash("Missing auth header please login")
        return make_response(render_template("login.html"), 401)
    

    【讨论】:

      【解决方案2】:

      我认为这不起作用的原因是因为 @jwt.unauthorized_loader 的回调方法已经在 @app.errorhandler 的上下文中调用,并且错误处理程序中引发的任何异常都不会触发其他错误处理程序。

      与其尝试通过中止和异常控制流来处理这个问题,为什么不直接使用帮助方法来进行自定义响应并在两个地方都使用它?

      def unauthorized_response():
          return make_response("Custom 401 Error", 401)
      
      @jwt.unauthorized_loader
      def unauthorized_callback(callback):
          return unauthorized_response()
      
      @app.errorhandler(401)
      def unauthorized(e):
          return unauthorized_response()
      

      【讨论】:

      • 非常感谢您的帮助。我试图在@jwt.unauthorized_loader 的触发器上重定向,所以我想抛出一个 401 错误,然后用例如@app.errorhandler(401) 捕获它并重定向。我这样做是因为我还在构建一个移动应用程序,我在其中遇到 401 错误,当我在 @jwt.unauthorized_loader 内重定向时,它总是错误 302,否则重定向将不起作用。所以我不能做make_response(redirect("/login"), 401)所以我的目标是抛出 401 错误,然后在网络应用和移动应用中以不同的方式处理它感谢您的帮助
      猜你喜欢
      • 2018-04-28
      • 1970-01-01
      • 1970-01-01
      • 2020-11-23
      • 2017-04-30
      • 1970-01-01
      • 2019-08-02
      • 1970-01-01
      • 2021-07-31
      相关资源
      最近更新 更多