具体详细讲解:https://www.cnblogs.com/xy-ouyang/p/12600055.html
https://datatracker.ietf.org/doc/html/rfc7617
具体详细讲解:https://datatracker.ietf.org/doc/html/rfc7616
具体详细讲解: https://datatracker.ietf.org/doc/html/rfc6750#section-3
项目中使用的几种实现方式:
std::tuple<QByteArray, QString, int> Http::Post(const QString &url, const QByteArray &array_data)
{
qDebug()<<array_data<<url;
QNetworkReply *Net_Reply;
QNetworkAccessManager Net_Manage;
QNetworkRequest Net_Request;
QSslConfiguration conf = Net_Request.sslConfiguration();
//"Basic dGVzdDoxMjPCow==" == "Basic" + " " + base64("用户名:密码")
Net_Request.setRawHeader("Authorization","Basic dGVzdDoxMjPCow==");
Net_Request.setUrl(url);
QEventLoop Loop;
Net_Reply = Net_Manage.post(Net_Request,array_data);
connect(Net_Reply,SIGNAL(finished()),&Loop,SLOT(quit()));
connect(Net_Reply,SIGNAL(error(QNetworkReply::NetworkError)),&Loop,SLOT(quit()));
Loop.exec();
QByteArray array = Net_Reply->readAll();
qDebug()<<array;
qDebug()<<Net_Reply->errorString();
Net_Reply->deleteLater();
return std::make_tuple(array,Net_Reply->errorString(),int(Net_Reply->error()));
}
std::tuple<QByteArray, QString, int> Http::Post(const QString &url, const QByteArray &body_data)
{
qDebug()<<array_data<<url;
QNetworkReply *Net_Reply;
QNetworkAccessManager Net_Manage;
QNetworkRequest Net_Request;
// "Digest XXXXX" == "Digest" + " " + "加密内容"
// 具体看双方协商怎末对内容加密
// 可能: 客户端生成 nonce 随机数, 以及服务端返会的slat
// key = MD5(nonce + slat)
// content = hamc(body_data, key)
Net_Request.setRawHeader("Authorization","Digest content");
Net_Request.setRawHeader("nonce","XXXXXXXXXXXX")
Net_Request.setUrl(url);
QEventLoop Loop;
Net_Reply = Net_Manage.post(Net_Request,body_data);
connect(Net_Reply,SIGNAL(finished()),&Loop,SLOT(quit()));
connect(Net_Reply,SIGNAL(error(QNetworkReply::NetworkError)),&Loop,SLOT(quit()));
Loop.exec();
QByteArray array = Net_Reply->readAll();
qDebug()<<array;
qDebug()<<Net_Reply->errorString();
Net_Reply->deleteLater();
return std::make_tuple(array,Net_Reply->errorString(),int(Net_Reply->error()));
}
std::tuple<QByteArray, QString, int> Http::Post(const QString &url, const QByteArray &array_data)
{
qDebug()<<array_data<<url;
QNetworkReply *Net_Reply;
QNetworkAccessManager Net_Manage;
QNetworkRequest Net_Request;
// "Bearer mF_9.B5f-4.1JqM" == "Bearer" + " " + Token
// 具体看实际需求,有可能鉴权既有token 也有 摘要
Net_Request.setRawHeader("Authorization","Bearer mF_9.B5f-4.1JqM");
Net_Request.setUrl(url);
QEventLoop Loop;
Net_Reply = Net_Manage.post(Net_Request,array_data);
connect(Net_Reply,SIGNAL(finished()),&Loop,SLOT(quit()));
connect(Net_Reply,SIGNAL(error(QNetworkReply::NetworkError)),&Loop,SLOT(quit()));
Loop.exec();
QByteArray array = Net_Reply->readAll();
qDebug()<<array;
qDebug()<<Net_Reply->errorString();
Net_Reply->deleteLater();
return std::make_tuple(array,Net_Reply->errorString(),int(Net_Reply->error()));
}
`WWW-Authenticate` 和 `Authenticate` 是两个与HTTP认证相关的HTTP头部字段,用于客户端和服务器之间交换身份验证信息。它们的区别在于使用的上下文和位置。
WWW-Authenticate
:
WWW-Authenticate
是服务器在HTTP响应中使用的头部字段。当客户端请求受保护的资源但未提供有效的身份验证信息时,服务器会返回一个"401 Unauthorized"响应,并在响应头中添加 WWW-Authenticate
字段,以提示客户端进行合适的身份验证。
服务器使用 WWW-Authenticate
来指示客户端应该使用哪种认证方式(如基本认证、摘要认证等)来验证其身份。
Authenticate
:
Authenticate
是客户端在HTTP请求中使用的头部字段。客户端在请求中包含 Authenticate
字段来提供身份验证凭据,以验证其身份并请求访问受保护的资源。WWW-Authenticate
在服务器响应中使用,通常是在用户尝试访问受保护资源时,服务器要求客户端进行身份验证的情况下。客户端会根据这个头部字段指示的认证方式提供相应的凭据。
Authenticate
在客户端请求中使用,当客户端向服务器发送请求时,它可能会在请求头中包含 Authenticate
字段,以根据服务器的要求提供相应的身份验证凭据。
总结来说,WWW-Authenticate
是服务器告知客户端应该如何进行身份验证的方式,而 Authenticate
是客户端在请求中提供身份验证凭据的方式。它们一起协同工作,确保通信双方能够进行有效的身份验证并访问受保护的资源。