4

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

401

WWW-Authenticate: Basic realm="Authentication Required"

)。

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

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

4

2 回答 2

8

因此,在将数据发送到客户端之前,实际上会再次处理烧瓶返回语句。您实际上可以发送两个元素的元组作为返回语句。第二个元素是状态(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 更改为其他任何内容。

于 2016-03-19T16:59:28.600 回答
3

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

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

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

  • 还有一个(我自己没有尝试过,但在其他地方看到过)是离开 401 和WWW-Authenticate,但是将 auth 方法从Basic浏览器未知的其他方法更改(即 notBasic和 not Digest)。例如,制作它CustomBasic

于 2015-07-28T03:22:14.623 回答