如何从flask API返回401身份验证?

时间:2015-07-28 02:54:03

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

我在flask中开发了一个API,它使用HttpBasicAuth对用户进行身份验证。 API在fiddler中运行得非常好,当我们传递错误的凭据时返回401但是当我在登录页面上使用相同的时候,我会从浏览器中弹出更多内容。我真的不希望看到这个要求凭据的额外弹出窗口(返回时浏览器的默认行为

  

401

  

WWW-Authenticate: Basic realm="Authentication Required"

)。

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

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

2 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:3)

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

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

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

  • 而另一个(我没有尝试过,但在其他地方已经提到过)是留下401和WWW-Authenticate,但是将auth方法从Basic更改为某些内容浏览器不知道的其他内容(即不是Basic而不是Digest)。例如,将其设为CustomBasic