我在flask中开发了一个API,它使用HttpBasicAuth对用户进行身份验证。 API在fiddler中运行得非常好,当我们传递错误的凭据时返回401但是当我在登录页面上使用相同的时候,我会从浏览器中弹出更多内容。我真的不希望看到这个要求凭据的额外弹出窗口(返回时浏览器的默认行为
401
带
WWW-Authenticate: Basic realm="Authentication Required"
)。
在本地部署时工作正常但在托管在远程服务器上时无法正常工作。
我们如何实现401不会让浏览器显示要求凭据的弹出窗口。
答案 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
。