这是在 QNetworkAccessManager 中添加摘要标头的正确方法吗

问题描述

你能帮我了解一下 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());