在 Flask 中使用 HTTP 身份验证时的标准 401 响应

发布于 2024-12-11 08:41:44 字数 426 浏览 0 评论 0 原文

在 Flask 中,我使用以下 snippet 来启用 HTTP 身份验证:

def authenticate():
    return Response('<Why access is denied string goes here...>', 401, {'WWW-Authenticate':'Basic realm="Login Required"'})

现在,根据我过去使用 Flask 的经验,如果某人的凭据不正确,我想让他们知道我可以调用:

abort(401)

这将为您提供基本的 apache 401 响应。有谁知道我如何使用上面的代码片段来实现它?

谢谢

In flask, I'm using the following snippet to enable HTTP auth:

def authenticate():
    return Response('<Why access is denied string goes here...>', 401, {'WWW-Authenticate':'Basic realm="Login Required"'})

Now, in my past experience with Flask, if someone's credentials are incorrect and I want to let them know I can just call:

abort(401)

This gives you the basic apache 401 response. Does anyone know how I can implement that with the snippet above?

Thanks

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

小巷里的女流氓 2024-12-18 08:41:44

在 Flask 中自定义错误响应确实非常简单。创建一个函数,其唯一参数是HTTP错误状态代码,使其返回一个flask.Response实例,并用@app.errorhandler

@app.errorhandler(401)
def custom_401(error):
    return Response('<Why access is denied string goes here...>', 401, {'WWW-Authenticate':'Basic realm="Login Required"'})

然后您可以随心所欲地使用abort(401)

Custom error responses are really quite easy in Flask. Create a function whose only argument is the HTTP error status code, make it return a flask.Response instance, and decorate it with @app.errorhandler.

@app.errorhandler(401)
def custom_401(error):
    return Response('<Why access is denied string goes here...>', 401, {'WWW-Authenticate':'Basic realm="Login Required"'})

You can then use abort(401) to your heart's content.

智商已欠费 2024-12-18 08:41:44

Flask 的 abort 直接来自 Werkzeug。它是一个可调用对象,可根据需要引发各种预定义的 HTTP 异常(HTTPException 的子类)。请查看此处的代码了解详细信息。

预定义的 Unauthorized (映射到 401)仅定义代码和消息,但不定义 WWW-Authenticate 标头,正如您所知,触发登录需要该标头- 浏览器弹出。 HTTPException 具有的标头在 HTTPException.get_headers 中硬编码为 [('Content-Type', 'text/html')]

因此,要添加 WWW-Authenticate 标头,请创建您自己的 Unauthorized 子类,覆盖 get_headers 函数,最后更新 abort.mapping 字典用它。

from flask import abort
from werkzeug.exceptions import Unauthorized

class MyUnauthorized(Unauthorized):
    description = '<Why access is denied string goes here...>'
    def get_headers(self, environ):
        """Get a list of headers."""
        return [
            ('Content-Type', 'text/html'),
            ('WWW-Authenticate', 'Basic realm="Login required"'),
        ]

abort.mapping.update({401: MyUnauthorized})

现在,所有 abort(401) 调用都会引发您的自定义异常。

Flask's abort comes directly from Werkzeug. It is a callable object, that raises various predefined HTTP exceptions (subclasses of HTTPException) on demand. Check out the code here for details.

The predefined Unauthorized (which is mapped to 401) only defines the code and a message, but not the WWW-Authenticate header, which as you know is required to trigger the login-popup with browsers. The headers an HTTPException has are hardcoded as [('Content-Type', 'text/html')] in HTTPException.get_headers.

So to add the WWW-Authenticate header, create your own Unauthorized subclass, overwrite the get_headers function and finally update the abort.mapping dictionary with it.

from flask import abort
from werkzeug.exceptions import Unauthorized

class MyUnauthorized(Unauthorized):
    description = '<Why access is denied string goes here...>'
    def get_headers(self, environ):
        """Get a list of headers."""
        return [
            ('Content-Type', 'text/html'),
            ('WWW-Authenticate', 'Basic realm="Login required"'),
        ]

abort.mapping.update({401: MyUnauthorized})

Now all abort(401) calls will raise your custom exception.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文