如何从 flask API return 401 身份验证?

How to return 401 authentication from flask API?

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

401

WWW-Authenticate: Basic realm="Authentication Required"

).

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

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

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

  • 您可以 return 非 401 状态代码。例如,return 403。从技术上讲这是错误的,但如果您可以控制 client-side API,则可以使它起作用。浏览器只会在收到 401 时显示登录对话框。

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

  • 还有一个(我自己没有尝试过,但在别处看到过)是保留 401 和 WWW-Authenticate,但将 auth 方法从 Basic 到浏览器未知的其他内容(即不是 Basic 也不是 Digest)。例如,设为 CustomBasic.

因此,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

为此:

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

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