在 MacOSX 上,当指定无效的身份验证凭据时,QNetworkAccessManager 进入无限循环

Posted

技术标签:

【中文标题】在 MacOSX 上,当指定无效的身份验证凭据时,QNetworkAccessManager 进入无限循环【英文标题】:On MacOSX, QNetworkAccessManager gets into an infinite loop when invalid auth credentials specified 【发布时间】:2013-03-29 16:18:52 【问题描述】:

在我的跨平台应用程序中,我使用 QNetworkAccessManager 将 HTTP 请求发送到需要身份验证的 HTTP 服务。我最近升级到 QT5,在 MacOSX 上让我完全惊讶的是,在某些情况下,我的应用程序会尽可能快地向我的服务发送大量请求。

在进行了一些调试之后,事实证明只有在我的请求中指定了错误的身份验证凭据时才会发生这种情况。如果在我的 HTTP 请求中指定了无效的用户名/密码,QNetworkAccessManager 将无限期地向我的服务重新发送请求。

我的代码在以前的 QT 版本中运行了很长时间,所以我决定它必须是 QT5 的东西。

【问题讨论】:

【参考方案1】:

我偶然发现了 QT5 中添加的以下增强功能:https://bugreports.qt.io/browse/QTBUG-22033

基本上,如果中间代理需要身份验证凭据,则此增强操作系统背后的想法是检查钥匙串中的用户名/密码。事实证明,这实现得很糟糕,并且此代码已添加到 QNetworkAccessManager::authenticationRequired() 信号中,而不是添加到 proxyAuthenticationRequired() 信号中。

关于这个问题的有趣部分是我没有为我的应用程序设置代理,也没有为我使用的 QNetworkAccessManager 设置代理。这使得这个问题很难调试!

由于放置不当,这种“钥匙串查询”会与任何 authenticationRequired 信号一起发生。底层的 getProxyAuth() 方法使用空白主机名调用“SecKeychainFindInternetPassword”,该主机名与我的钥匙串中的第一个“Internet 密码”匹配,并使用它向我的服务发送带有这个新凭据的请求。想象一下,当我看到我的其他/个人密码之一被发送到我的 HTTP 服务时,我会感到惊讶!

这不仅是一个安全问题,而且会导致您的应用程序出现无限循环。我用 QT 打开了一个关于这个的错误:https://bugreports.qt.io/browse/QTBUG-30434

有临时解决办法吗?有!我一直在寻找解决此问题的方法。这是一个讨厌的黑客。但它一直有效,直到 QT 家伙连续获得他们的鸭子。此 hack 之所以有效,是因为它确保“SecKeychainFindInternetPassword”与钥匙串中的任何条目都不匹配,因此会跳过该“钥匙串查询”。

基本上,我将代理主机名设置为“”而不是“”,这将防止任何匹配导致我的应用程序出现无限循环。

解决方法:

 QNetworkProxy proxy = manager_->proxy();
 proxy.setHostName(" ");
 manager_->setProxy(proxy);

我希望这个问题在 QT 的下一个版本中得到解决,这样我就可以删除这个可怕的 hack。

【讨论】:

以上是关于在 MacOSX 上,当指定无效的身份验证凭据时,QNetworkAccessManager 进入无限循环的主要内容,如果未能解决你的问题,请参考以下文章

Jwt 身份验证问题 - 凭据无效

Firebase Push - 身份验证凭据无效

Spring Security (4.0.1) 与 AngularJS 的集成。每次用户输入无效凭据时都会弹出基本身份验证

用于创建手机身份验证凭据的验证ID在flutter中无效

PayPal PHP SDK:由于身份验证凭据无效或缺少授权标头,身份验证失败

请求具有无效的身份验证凭据。预期的 OAuth 2 访问令牌、登录 cookie 或其他有效的身份验证凭据 automl