问题描述
你能帮我了解一下 QNetworkAccessManager。我正在尝试在 C++ QNetworkAccessManager 中进行摘要身份验证,我无法在不计算摘要数据的情况下发送请求。所以我正在通过计算 md5 来做请求。有人知道吗?这是在 QNetworkAccessManager 中添加摘要响应标头的正确方法吗。
谢谢,
QString G_username = QString::fromUtf8(_userName.c_str());
QString G_realm = QString::fromUtf8(_realm.c_str());
QString G_nonce = QString::fromUtf8(_nonce.c_str());
QString G_uri = QString::fromUtf8(urlAfterIp.c_str());
QString G_response = QString::fromUtf8(ha3.c_str());
QString G_qop = QString::fromUtf8(_qop.c_str());
QString G_nc = QString::fromUtf8((_ncString).c_str());
QString G_cnonce = QString::fromUtf8(_cnonce.c_str());
QEventLoop loop;
QNetworkAccessManager* manager = new QNetworkAccessManager();
qnetworkrequest networkRequest;
networkRequest.setUrl(QUrl("http://172.16.101.68/reset"));
//networkRequest.setRawHeader(QByteArray("Authorization"),digestValuetoAdd.toUtf8());
networkRequest.setRawHeader(QByteArray("Digest username"),G_username.toUtf8());
networkRequest.setRawHeader(QByteArray("realm"),G_realm.toUtf8());
networkRequest.setRawHeader(QByteArray("nonce"),G_nonce.toUtf8());
networkRequest.setRawHeader(QByteArray("uri"),G_uri.toUtf8());
networkRequest.setRawHeader(QByteArray("algorithm"),"MD5");
networkRequest.setRawHeader(QByteArray("response"),G_response.toUtf8());
networkRequest.setRawHeader(QByteArray("qop"),G_qop.toUtf8());
networkRequest.setRawHeader(QByteArray("nc"),G_nc.toUtf8());
networkRequest.setRawHeader(QByteArray("cnonce"),G_cnonce.toUtf8());
QLabel *label = new QLabel();
QNetworkReply *reply = manager->get(networkRequest);
QObject::connect(reply,SIGNAL(readyRead()),label,SLOT(slotReadyRead()));
QObject::connect(reply,SIGNAL(finished()),SLOT(slotOnRequestCompleted()));
QObject::connect(reply,SIGNAL(error(QNetworkReply::NetworkError)),SLOT(slotOnRequestError(QNetworkReply::NetworkError)));
QObject::connect(reply,SIGNAL(sslErrors(QList<QSslError>)),SLOT(slotSslErrors(QList<QSslError>)));
QObject::connect(reply,&loop,SLOT(quit()));
loop.exec();
QByteArray dataReceived = reply->readAll();
QString dataReply(dataReceived);
解决方法
我解决了这个问题,添加摘要标题的正确方法是:
digestResponse = "Digest username=\"" + _userName + "\"" + ",realm=\"" + _realm
+
"\"" + ",nonce=\"" + _nonce + "\""
+ ",uri=\"" + urlAfterIp +"\"" + ",algorithm=MD5" + ",response="
+
"\"" + ha3 +"\"" + ",qop=" + _qop + ",nc="
+ _ncString + ",cnonce=\"" +_cnonce + "\"";
QEventLoop loop;
QNetworkAccessManager* manager = new QNetworkAccessManager();
QNetworkRequest networkRequest;
networkRequest.setUrl(QUrl("http://172.16.101.68/reset"));
networkRequest.setRawHeader("Authorization",digestResponse.c_str());