Python 2.7 如何从flask API返回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,它不会让浏览器显示请求凭据的弹

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

401

WWW-Authenticate:Basic realm=“需要认证”

)

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


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

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

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

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

  • 还有一个(我自己没有尝试过,但在其他地方也提到过)是离开401和
    WWW-Authenticate
    ,但将auth方法从
    Basic
    更改为浏览器未知的其他方法(即不是
    Basic
    和不是
    Digest
    )。例如,将其设置为
    CustomBasic


因此,在将数据发送到客户端之前,flask return语句实际上会被再次处理。实际上,您可以将两个元素的元组作为返回语句发送。第二个元素是status(),如果您使用的是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更改为其他任何内容。

谢谢您的回复。我试着使用abort(401),这似乎是可行的,但我喜欢你的第三点,这有点符合标准。哦,伙计,非常感谢你这么做了,我一直在到处寻找这样干净的解决方案