【问题标题】:How to return 401 authentication from flask API?如何从烧瓶 API 返回 401 身份验证?
【发布时间】:2015-07-28 02:54:03
【问题描述】:

我在烧瓶中开发了一个 API,它使用 HttpBasicAuth 对用户进行身份验证。 API 在提琴手中工作得非常好,当我们传递错误的凭据时返回 401,但是当我在登录页面上使用相同的凭据时,我会从浏览器中弹出额外的信息。我真的不想看到这个要求凭据的额外弹出窗口(返回时浏览器的默认行为

401

WWW-Authenticate: Basic realm="Authentication Required"

)。

在本地部署时可以正常工作,但在远程服务器上托管时无法正常工作。

我们如何实现 401,它不会让浏览器显示要求凭据的弹出窗口。

【问题讨论】:

    标签: python-2.7 flask basic-authentication www-authenticate


    【解决方案1】:

    因此,在将数据发送到客户端之前,实际上会再次处理烧瓶返回语句。您实际上可以发送两个元素的元组作为返回语句。第二个元素是状态 (https://en.wikipedia.org/wiki/List_of_HTTP_status_codes) 如果你使用的是 auth 库,你可以改变这个:

    @auth.error_handler
    def unauthorized():
        response = jsonify({'message':'Failed'})
        return response
    

    到这里:

    @auth.error_handler
    def unauthorized():
        response = jsonify({'message':'A winner is you'})
        return response, 404
    

    如果您不想要弹出消息,请将 401 更改为其他任何内容。

    【讨论】:

    • 天哪,非常感谢你做到了,一直在到处寻找这样干净的解决方案
    【解决方案2】:

    这是使用 REST API 和浏览器客户端时的常见问题。不幸的是,没有干净的方法来阻止浏览器显示弹出窗口。但是你可以做一些技巧:

    • 您可以返回非 401 状态代码。例如,返回 403。从技术上讲这是错误的,但如果您可以控制客户端 API,则可以使其工作。浏览器只有在收到 401 时才会显示登录对话框。

    • 另一个可能更简洁的技巧是在响应中保留 401,但在响应中不包含 WWW-Authenticate 标头。这也将停止出现登录对话框。

    • 还有一个(我自己没有尝试过,但在其他地方看到过)是离开 401 和 WWW-Authenticate,但将身份验证方法从 Basic 更改为其他未知的方法到浏览器(即不是Basic 也不是Digest)。例如,设为CustomBasic

    【讨论】:

    • 感谢您的回复。我尝试使用 abort(401) 似乎可以正常工作,但我喜欢您的第 3 点,它有点符合标准。
    猜你喜欢
    • 2019-03-28
    • 2019-09-13
    • 1970-01-01
    • 2014-04-09
    • 1970-01-01
    • 2020-03-13
    • 2017-09-05
    • 2016-10-02
    • 2021-09-06
    相关资源
    最近更新 更多