Python 2.7 如何从flask API返回401身份验证?
我已经在flask中开发了一个API,它使用HttpBasicAuth对用户进行身份验证。API在fiddler中运行得非常好,当我们传递错误的凭证时返回401,但当我在登录页面上使用相同的凭证时,我会从浏览器中获得额外的弹出窗口。我真的不想看到这个额外的弹出窗口,它要求提供凭证(返回时浏览器的默认行为)Python 2.7 如何从flask API返回401身份验证?,python-2.7,flask,basic-authentication,www-authenticate,Python 2.7,Flask,Basic Authentication,Www Authenticate,我已经在flask中开发了一个API,它使用HttpBasicAuth对用户进行身份验证。API在fiddler中运行得非常好,当我们传递错误的凭证时返回401,但当我在登录页面上使用相同的凭证时,我会从浏览器中获得额外的弹出窗口。我真的不想看到这个额外的弹出窗口,它要求提供凭证(返回时浏览器的默认行为) 401 与 WWW-Authenticate:Basic realm=“需要认证” ) 它在本地部署时工作正常,但在远程服务器上托管时不工作 我们如何实现401,它不会让浏览器显示请求凭据的弹
401
与
WWW-Authenticate:Basic realm=“需要认证”
)
它在本地部署时工作正常,但在远程服务器上托管时不工作
我们如何实现401,它不会让浏览器显示请求凭据的弹出窗口。这是使用REST API和浏览器客户端时的常见问题。不幸的是,没有干净的方法来阻止浏览器显示弹出窗口。但是你可以做一些技巧:
- 您可以返回非401状态代码。例如,返回403。从技术上讲,这是错误的,但如果您控制了客户端API,就可以让它工作。浏览器仅在收到401密码时显示登录对话框
- 另一个可能更简洁的技巧是在响应中保留401,但不要在响应中包含
头。这也将停止出现登录对话框WWW-Authenticate
- 还有一个(我自己没有尝试过,但在其他地方也提到过)是离开401和
,但将auth方法从WWW-Authenticate
更改为浏览器未知的其他方法(即不是Basic
和不是Basic
)。例如,将其设置为Digest
CustomBasic
@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更改为其他任何内容。谢谢您的回复。我试着使用abort(401),这似乎是可行的,但我喜欢你的第三点,这有点符合标准。哦,伙计,非常感谢你这么做了,我一直在到处寻找这样干净的解决方案