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

Muk*_*esh 3 basic-authentication www-authenticate flask python-2.7

我已经在Flask中开发了一个API,该API使用HttpBasicAuth对用户进行身份验证。API在提琴手中绝对正常,当我们通过错误的凭据时返回401,但是当我在登录页面上使用相同的凭据时,浏览器会弹出额外的弹出窗口。我真的不想看到这个额外的弹出窗口,它要求提供凭据(返回时浏览器的默认行为

401

WWW-Authenticate: Basic realm="Authentication Required"

)。

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

我们如何实现401,让浏览器不显示弹出窗口以询问凭据。

Que*_*ayo 5

因此,flask return语句实际上是在将数据发送给客户端之前再次处理的。您实际上可以发送两个元素的元组作为return语句。第二个元素是状态(https://en.wikipedia.org/wiki/List_of_HTTP_status_codes)如果使用的是auth库,则可以更改此设置:

@auth.error_handler
def unauthorized():
    response = jsonify({'message':'Failed'})
    return response
Run Code Online (Sandbox Code Playgroud)

对此:

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

如果您不希望弹出消息,则将401更改为其他任何消息。


Mig*_*uel 3

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

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

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

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