Qt http 的认证方式以及简单实现

这篇具有很好参考价值的文章主要介绍了Qt http 的认证方式以及简单实现。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

http 的认证方式

  1. 基本认证(Basic Authentication):
    • 基本认证是最简单的HTTP认证方式。客户端在请求头中使用Base64编码的用户名和密码进行身份验证
    • 由于仅使用Base64编码,基本认证并不安全,因此建议与HTTPS一起使用,以加密传输

具体详细讲解:https://www.cnblogs.com/xy-ouyang/p/12600055.html
https://datatracker.ietf.org/doc/html/rfc7617

  1. 摘要认证(Digest Authentication):
    • 摘要认证是比基本认证更安全的一种方式。它通过在服务器和客户端之间交换摘要值来进行身份验证。
    • 客户端发送请求后,服务器返回一个随机值(称为nonce),客户端使用用户名、密码、nonce和其他信息计算出一个哈希值,然后将其发送到服务器进行验证。
    • 摘要认证提供了更好的保护,防止密码在传输过程中被窃取,但仍然需要注意保护nonce的安全性。

具体详细讲解:https://datatracker.ietf.org/doc/html/rfc7616

  1. Bearer Token认证:
    • Bearer Token认证是一种常用于OAuth 2.0和单点登录(SSO)系统的方式。客户端在请求头中发送一个令牌(token)来进行身份验证。
    • 令牌通常在登录后由服务器分发,客户端需要将令牌存储起来,然后在每次请求中发送给服务器进行验证。
    • Bearer Token认证可以是无状态的,但也需要保护令牌的安全性,避免泄露。

具体详细讲解: https://datatracker.ietf.org/doc/html/rfc6750#section-3

  1. 客户端证书认证:
    • 客户端证书认证是一种高度安全的方式,客户端在请求中使用证书进行身份验证。
    • 客户端需要事先获取一个证书,服务器会验证该证书的有效性和授权。
    • 这种方式适用于需要高级别的安全性保护的场景,如金融、医疗等领域。

代码实现方式:

项目中使用的几种实现方式:

  1. 基本认证(Basic Authentication):
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()));
}


  1. 摘要认证(Digest Authentication):
      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()));
}
  1. Bearer Token认证:
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 的介绍

`WWW-Authenticate` 和 `Authenticate` 是两个与HTTP认证相关的HTTP头部字段,用于客户端和服务器之间交换身份验证信息。它们的区别在于使用的上下文和位置。

两者区别:

  1. WWW-Authenticate

    • WWW-Authenticate 是服务器在HTTP响应中使用的头部字段。当客户端请求受保护的资源但未提供有效的身份验证信息时,服务器会返回一个"401 Unauthorized"响应,并在响应头中添加 WWW-Authenticate 字段,以提示客户端进行合适的身份验证。

    • 服务器使用 WWW-Authenticate 来指示客户端应该使用哪种认证方式(如基本认证、摘要认证等)来验证其身份。

  2. Authenticate

    • Authenticate 是客户端在HTTP请求中使用的头部字段。客户端在请求中包含 Authenticate 字段来提供身份验证凭据,以验证其身份并请求访问受保护的资源。
    • 这是客户端在发起身份验证请求时使用的字段,通常与请求中的身份验证方式(如基本认证、Bearer Token等)一起发送。

使用场景:

  • WWW-Authenticate 在服务器响应中使用,通常是在用户尝试访问受保护资源时,服务器要求客户端进行身份验证的情况下。客户端会根据这个头部字段指示的认证方式提供相应的凭据。

  • Authenticate 在客户端请求中使用,当客户端向服务器发送请求时,它可能会在请求头中包含 Authenticate 字段,以根据服务器的要求提供相应的身份验证凭据。

总结来说,WWW-Authenticate 是服务器告知客户端应该如何进行身份验证的方式,而 Authenticate 是客户端在请求中提供身份验证凭据的方式。它们一起协同工作,确保通信双方能够进行有效的身份验证并访问受保护的资源。文章来源地址https://www.toymoban.com/news/detail-676986.html

到了这里,关于Qt http 的认证方式以及简单实现的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Qt Http请求,post和get的两种方式

    今天我们介绍一下QT的http请求,这里有post和get两种方式 一、post请求方式:参数分为网址和具体请求值两个部分,有时候还需要设置头信息,看具体情况定 二、get请求方式:参数和网址拼接到一起请求 三、主要区别: get用于请求获取数据,post向指定的资源创建修改数据 g

    2024年02月15日
    浏览(53)
  • Qt所有容器之间的区别,以及如何简单使用?

    Qt中常用的容器有 QList、QVector、QMap、QHash、QSet 等,它们都具有不同的特性和适用场景。 1. QList:动态数组,可以动态增加和删除元素,支持随机访问和迭代,适用于不需要频繁插入或删除元素的场景。 ```cpp QListint list; list.append(1); list.append(2); foreach(int val, list) {     qDebug()

    2024年01月19日
    浏览(35)
  • QT Designer 生成的ui文件转化成py文件以及简单使用

    首先用QTdesigner 设计你的界面 然后保存成.ui文件 这一步大家应该都可以做到,就不细讲了 然后就是转换步骤 使用cmd进入ui所在目录 或者在pycharm项目里的终端进入ui所在目录 然后输入下列语句 这里的outputUI就可以替换成你想要的输出文件名 InputUI就是你想要转换的ui文件名 稍

    2023年04月08日
    浏览(52)
  • QT中信号与槽机制的介绍,以及信号与槽连接的几种方式

    功能:实现多个组件之间的相互通信,是QT引以为傲的核心机制 信号:就是信号函数,定义在类体的signals权限下,是一个不完整的函数,只有声明没有定义; 槽:就是槽函数,定义在类体的slots权限下,是一个完整的函数,既有声明也有定义,也可以当做普通函数被使用 无

    2024年02月10日
    浏览(48)
  • Qt实现简单拼图游戏

    自己简单实现了下拼图功能.本来开始只是想显示个图片的。 ![请添加图片描述](https://img-blog.csdnimg.cn/c71922e2babf4404bf2805129f13ff76.gif 提示:以下是本篇文章正文内容,下面案例可供参考 代码如下(示例): 代码如下(示例): 代码如下(示例): 代码如下(示例): 源码下载

    2024年02月12日
    浏览(46)
  • pcl+vtk(三)QT中使用QVTKOpenGLNativeWidget的简单教程以及案例,利用PCLVisualizer显示点云

    先添加一个带有ui的QT应用程序。 先拖出来一个QOpenGLWidget控件 修改布局如下: 然后将QOpenGLWidget控件提升为QVTKOpenGLNativeWidget控件,步骤如下: 右击QOpenGLWidget窗口,选择【提示为...】  输入提升的类名称为QVTKOpenGLNativeWidget  此时需要把自动生成的qvtkopenglnativewidget.h修改为QV

    2024年01月25日
    浏览(36)
  • Qt实现HTTP的Get/Post请求

    借助Qt的NetWork模块,可以轻松的实现HTTP的Get/Post请求,而不需要再次引用像libcurl这样的第三方库。 当然,Qt的NetWork模块提供的功能远远不只是HTTP方面的。 另外,使用Qt网络模块还需要引用Qt5Network.lib库。 先构造一个QNetworkAccessManager对象,QNetworkAccessManager对象提供了发送QNe

    2024年02月07日
    浏览(48)
  • Qt拖拽事件简单实现

    重写resizeEvent(这个按需重写)、dragEnterEvent(拖拽事件函数)、dropEvent(放下事件函数),可以将本地图片拖拽到label标签中  

    2024年01月20日
    浏览(49)
  • Qt实现简单的漫游器

     Qt主要是使用QOpenGLWidget来实现opengl的功能。  QOpenGLWidget 提供了三个便捷的虚函数,可以重载,用来重新实现典型的OpenGL任务: paintGL:渲染OpenGL场景。widget 需要更新时调用。 resizeGL:设置OpenGL视口、投影等。widget 调整大小(或首次显示)时调用。 initializeGL:设置OpenGL资

    2024年02月12日
    浏览(29)
  • Qt实现简单计算器

    三级项目想用Qt做界面。 为了熟悉一下Qt操作,历时8h做了个计算器。 没用到数据库,布的控件也比较简单。 所以calculator.pro和widget.ui就不放了(太长了占地方) 文件压缩包放在下一篇了,需要自取。 自学时间较短,有很多不足欢迎指正。 ⭐:del按键上的图片用的是绝对路

    2024年02月11日
    浏览(48)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包