QWebView显示‘Network Access is disabled’及Qt网络错误99求助
QWebView无法加载Okta SAML URL的排查方案
运行环境
- Ubuntu 22.04
- Qt 5.12.8
- OpenSSL 1.1.1f
问题描述
QWebView加载特定Okta SAML URL时失败,该URL在Firefox浏览器中能正常访问,但QWebView返回如下错误日志:
Failed URL: "https://dev-81029421.okta.com/app/dev-81029421_442710740samlidp_1/exkanm3x81DrxatKc5d7/sso/saml" NetworkError: QNetworkReply::UnknownNetworkError http status = 0 httpStatusMsg = ""
(截图时间:2024年1月17日上午9:28:49)
我的QWebView配置代码如下,反复检查后未发现明显问题,求后续排查方向:
QWebView * m_samlView = new QWebView(); // Set User Agent QString browserUserAgent = m_samlView->page()->mainFrame()->evaluateJavaScript("navigator.userAgent").toString(); m_pUserAgentPage = new UserAgentWebPage(); m_pUserAgentPage->setBrowserUserAgent(browserUserAgent); m_samlView->setPage(m_pUserAgentPage); // Network Access Manager m_pNetworkAccessManager = new QNetworkAccessManager(); m_pNetworkAccessManager->setNetworkAccessible(QNetworkAccessManager::Accessible); m_samlView->page()->setNetworkAccessManager(m_pNetworkAccessManager); // Network Proxy checkProxy(); QNetworkProxy::setApplicationProxy(m_networkProxy); m_samlView->page()->networkAccessManager()->setProxy(m_networkProxy); // Enable Javascript m_samlView->page()->settings()->setAttribute(QWebSettings::JavascriptEnabled, true); // Enable web inspector m_samlView->page()->settings()->setAttribute(QWebSettings::DeveloperExtrasEnabled, true); QWebInspector inspector; inspector.setPage(m_samlView->page()); inspector.setVisible(true); // Setup Network Cookie Jar m_pCookieJar = new CookieJar(); m_samlView->page()->networkAccessManager()->setCookieJar(m_pCookieJar); // Clear cache and cookies clearCacheAndCookies(); // QWebView: Connect signals/slots connect(m_samlView, SIGNAL(urlChanged(const QUrl&)), this, SLOT(onUrlChanged(const QUrl&))); connect(m_samlView, SIGNAL(loadFinished(bool)), this, SLOT(onLoadFinished(bool))); // QNetworkAccessManager: Connect signals/slots connect(m_pNetworkAccessManager, SIGNAL(finished(QNetworkReply*)), this, SLOT(onFinished(QNetworkReply*))); connect(m_pNetworkAccessManager, SIGNAL(sslErrors(QNetworkReply*, const QList<QSslError>&)), this, SLOT(onSslErrors(QNetworkReply*, const QList<QSslError>&)));
排查方向
1. 检查SSL/TLS协议兼容性
Qt 5.12.8默认SSL配置可能不支持Okta要求的TLS版本(比如TLS 1.3),手动指定兼容的协议测试:
QSslConfiguration sslConfig = QSslConfiguration::defaultConfiguration(); sslConfig.setProtocol(QSsl::TlsV1_2OrLater); m_pNetworkAccessManager->setSslConfiguration(sslConfig);
同时确认OpenSSL 1.1.1f是否启用了对应协议支持,Qt编译时是否关联了正确的OpenSSL库。
2. 捕获更详细的错误信息
在onSslErrors槽中打印所有SSL错误细节,排查证书验证问题:
void onSslErrors(QNetworkReply* reply, const QList<QSslError>& errors) { qDebug() << "SSL错误详情:"; for (const QSslError& err : errors) { qDebug() << err.errorString(); } // 临时忽略SSL错误测试(仅用于排查,生产环境别这么做) reply->ignoreSslErrors(); }
另外在onFinished槽中调用reply->errorString(),可能拿到比UnknownNetworkError更具体的错误描述。
3. 替换User-Agent为Firefox的字符串
代码中获取的默认User-Agent和Firefox差异大,直接用Firefox的UA测试:
QString firefoxUA = "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:121.0) Gecko/20100101 Firefox/121.0"; m_pUserAgentPage->setBrowserUserAgent(firefoxUA);
4. 测试默认CookieJar
自定义CookieJar可能存在处理问题,临时替换为默认实现:
m_samlView->page()->networkAccessManager()->setCookieJar(new QNetworkCookieJar());
5. 排查代理配置冲突
同时设置了全局代理和NetworkAccessManager的代理,可能有冲突。尝试只保留一种配置,或者检查代理是否需要认证,代码中是否处理了代理认证逻辑。
6. 考虑WebKit版本限制
Qt 5.12.8的QWebView基于旧版WebKit,可能不支持现代网页的某些JS特性或安全机制。如果项目允许,可尝试替换为Qt WebEngine;或者查找对应Qt版本的WebKit补丁。
内容的提问来源于stack exchange,提问作者anshah
相关产品推荐
相关产品推荐

