首页 > 解决方案 > 使用 Qt 进行 C++ 摘要身份验证

问题描述

我想问一个关于 c++ rest 库的问题。在这里,我想用 c++ 代码编写一个摘要认证。我正在使用 Qt 库。为了进行摘要身份验证,我需要从标头中获取 nonce 令牌。我正在尝试使用我的代码读取响应标头。下面的代码可以正常工作以获得响应,但“manager->head”不起作用。你能帮我吗,我怎样才能读取标题,所以我可以获得随机数令牌。

QNetworkRequest request1;
request1.setUrl(QUrl("http://172.16.101.68/reset")); 
QNetworkAccessManager* manager = new QNetworkAccessManager();
QNetworkReply*reply = manager->get(request1);
//QNetworkReply*reply = manager->head(request1); this is not working
QEventLoop loop;
QObject::connect(reply, SIGNAL(finished()), &loop, SLOT(quit()));
loop.exec();

QByteArray data1 = reply->readAll();
QString dataReply(data1);

标签: c++qtauthenticationhash

解决方案


我已经以这种方式解决了问题;
我更喜欢以经典方式编写摘要认证。摘要认证有两个步骤。这些是接收随机数和发送用户名+密码+随机数组合。下面的代码是c++ QnetworkAccessManager中发送密码、用户名、nonce的部分。

 digestResponse = "Digest username=\"" + _userName  + "\"" + ", realm=\"" + _realm + 
    "\"" + ", nonce=\"" + _nonce + "\""
                   + ", uri=\"" + urlAfterIp +"\"" + ", algorithm=MD5" + ", response=" 
  + "\"" + ha3  +"\"" + ", qop=" + _qop + ", nc="
                   + _ncString + ", cnonce=\"" +_cnonce + "\"";


    //setting the variables.............

  QEventLoop loop;

  QNetworkAccessManager* manager = new QNetworkAccessManager();
  QNetworkRequest networkRequest;
  networkRequest.setUrl(QUrl("http://172.16.101.68/reset"));

  networkRequest.setRawHeader("Authorization", digestResponse.c_str());
  QObject *a = new QObject();
  QNetworkReply *reply = manager->get(networkRequest);

  QObject::connect(reply, SIGNAL(readyRead()),
          a, SLOT(slotReadyRead()));
  QObject::connect(reply, SIGNAL(finished()),
          a, SLOT(slotOnRequestCompleted()));
  QObject::connect(reply, SIGNAL(error(QNetworkReply::NetworkError)),
          a, SLOT(slotOnRequestError(QNetworkReply::NetworkError)));
  QObject::connect(reply, SIGNAL(sslErrors(QList<QSslError>)),
          a, SLOT(slotSslErrors(QList<QSslError>)));

  QObject::connect(reply, SIGNAL(finished()), &loop, SLOT(quit()));


  loop.exec();

  QByteArray dataReceived = reply->readAll();
  QString dataReply(dataReceived);    

推荐阅读