如何从 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 更改为其他任何内容。
我在 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 更改为其他任何内容。