Qt之HTTPS登录(集成QNetworkAccessManager提前修改QSslConfiguration,然后post)

简述

HTTPS(全称:Hyper Text Transfer Protocol over Secure Socket Layer),是以安全为目标的HTTP通道,简单讲是HTTP的安全版。即HTTP下加入SSL层,HTTPS的安全基础是SSL,因此加密的详细内容需要SSL。它是一个URI scheme(抽象标识符体系),句法类同http:体系。用于安全的HTTP数据传输。https:URL表明它使用了HTTP,但HTTPS存在不同于HTTP的默认端口及一个加密/身份验证层(在HTTP与TCP之间)。这个系统的最初研发由网景公司(Netscape)进行,并内置于其浏览器Netscape Navigator中,提供了身份验证与加密通讯方法。现在它被广泛用于万维网上安全敏感的通讯,例如交易支付方面。

HTTPS和HTTP的区别

超文本传输协议HTTP被用于在Web浏览器和网站服务器之间传递信息。HTTP协议以明文方式发送内容,不提供任何方式的数据加密,如果攻击者截取了Web浏览器和网站服务器之间的传输报文,就可以直接读懂其中的信息,因此HTTP协议不适合传输一些敏感信息,比如信用卡号、密码等。

为了解决HTTP协议的这一缺陷,需要使用另一种协议:安全套接字层超文本传输协议HTTPS。为了数据传输的安全,HTTPS在HTTP的基础上加入了SSL协议,SSL依靠证书来验证服务器的身份,并为浏览器和服务器之间的通信加密。

HTTPS和HTTP的区别主要为以下四点:

  1. https协议需要到ca申请证书,一般免费证书很少,需要交费。
  2. http是超文本传输协议,信息是明文传输,https 则是具有安全性的ssl加密传输协议。
  3. http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。
  4. http的连接很简单,是无状态的;HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,比http协议安全。

使用说明

关于网络接口的调用这里不再过多说明,因为一般接口都会有详细的文档,比如:请求方式get/post、参数格式、返回类型等。

因为需要Openssl支持,使用SSL进行认证,所以需要对应的库文件-ssleay32.dll、libeay32.dll,可以参考:http://slproweb.com/products/Win32OpenSSL.html,我下载的版本为-Win32 OpenSSL v1.0.2g Light,将bin目录下面的库拷贝出来放到exe同级目录下即可。为了更好的兼容,最好是编译源码!

下面以HTTPS为例,描述一个完整的登录过程,也适用于HTTP及其它形式网络交互,比如:用户认证、上传、下载等。

MD5加密

为了安全起见,都会对敏感数据进行加密,而最常用的基本都是MD5。

QString md5(const QString &text)
{
    QByteArray byteArray;
    byteArray.append(text);
    QByteArray hash = QCryptographicHash::hash(byteArray, QCryptographicHash::Md5);

    return hash.toHex();
}

HTTPS登录

进行SSL认证、设置传输的参数、设置消息头、开始请求、处理返回结果。

LoginNetworkManager::LoginNetworkManager(QObject *parent)
    : QNetworkAccessManager(parent)
{
    // SSL认证
    m_sslConfig = QSslConfiguration::defaultConfiguration();
    m_sslConfig.setPeerVerifyMode(QSslSocket::VerifyNone);
    m_sslConfig.setProtocol(QSsl::TlsV1_2);

    connect(this, SIGNAL(finished(QNetworkReply *)), this, SLOT(replyFinished(QNetworkReply *)));
}

// 结束请求
LoginNetworkManager::~LoginNetworkManager()
{
    if (m_pReply != NULL)
    {
        m_pReply->abort();
        m_pReply->deleteLater();
    }
}

// 设置登录数据
void LoginNetworkManager::setParams(const QString &userName, const QString &password)
{
    m_strUserName = userName;
    m_strPassword = password;
}

void LoginNetworkManager::execute()
{
    QByteArray userNameByteArray = m_strUserName.toUtf8();
    QByteArray userNameEncoding = userNameByteArray.toPercentEncoding();

    // 设置发送的数据
    QByteArray dataArray;
    dataArray.append(QString("user_name=%1&").arg(QString(userNameEncoding)));
    dataArray.append(QString("password=%1&").arg(md5(m_strPassword)));
    dataArray.append("token_type=TOKEN");

    // 设置消息头
    QNetworkRequest request;
    request.setSslConfiguration(m_sslConfig);
    request.setHeader(QNetworkRequest::ContentTypeHeader, "application/x-www-form-urlencoded");
    request.setHeader(QNetworkRequest::ContentLengthHeader, dataArray.length());
    request.setUrl(QUrl(LOGIN_URL));

    // 开始请求
    m_pReply = post(request, dataArray);
}

// 响应结束
void LoginNetworkManager::replyFinished(QNetworkReply *reply)
{
    QByteArray bytes = reply->readAll();

    QString strUserID("");
    int nCode = -1;

    QJsonParseError jsonError;
    QJsonDocument doucment = QJsonDocument::fromJson(bytes, &jsonError);
    if (jsonError.error == QJsonParseError::NoError)
    {
        if (doucment.isObject())
        {
            QJsonObject object = doucment.object();
            if (object.contains("userId"))
            {
                QJsonValue userID = object.take("userId");
                if (userID.isString())
                {
                    strUserID = userID.toString();
                }
            }
            if (object.contains("code"))
            {
                QJsonValue codeValue = object.take("code");
                if (codeValue.isDouble())
                {
                    nCode = codeValue.toVariant().toInt();
                }
            }
        }
    }

    // 发送结果数据
    if (!strUserID.isEmpty())
    {
        emit onSuccess(strUserID);
    }
    else
    {
        emit onFail(nCode);
    }
}

使用方式

LoginNetworkManager *pLoginNetworkManager = new LoginNetworkManager(this);
connect(pLoginNetworkManager, SIGNAL(onSuccess(const QString &)), this, SLOT(onSuccess(const QString &)));
connect(pLoginNetworkManager, SIGNAL(onFail(int)), this, SLOT(onFail(int)));

// 设置参数
pLoginNetworkManager->setParams("test", "123456");
pLoginNetworkManager->execute();

结果处理

一般来说常用的返回格式为JSON、XML,当然也可以用特定格式的字符串,但大多数都是JSON较多。

得到结果后,我们就可以对返回的JSON进行解析,然后处理!

正确: 
“{“user_id”:”SELF-666666666_Qt-mr2Sj_9Iu92FWd-PqALbtwl6ZgtAFA”,”role”:1,”sex”:0,”user_name”:”test”,”create_date”:1449449966000}”

错误: 
{“msg”:”user_name=test and password is error.”,”code”:418,”error_msg”:”password is invalid”}

http://blog.csdn.net/liang19890820/article/details/50800712

时间: 2024-08-25 23:40:57

Qt之HTTPS登录(集成QNetworkAccessManager提前修改QSslConfiguration,然后post)的相关文章

JEESZ分布式框架--单点登录集成方案

  JEESZ分布式框架单点登录集成方案第一节:单点登录简介 第一步:了解单点登录SSO主要特点是: SSO应用之间使用Web协议(如HTTPS) ,并且只有一个登录入口.SSO的体系中有下面三种角色:1) User(多个)2) Web应用(多个)3) SSO认证中心(一个) SSO实现包含以下三个原则:1) 所有的登录都在 SSO 认证中心进行.  2) SSO认证中心通过一些方法来告诉Web应用当前访问用户究竟是不是通过认证的用户.  3) SSO认证中心和所有的 Web 应用建立一种信任关

QQ登录集成到自己网站php代码(转载)

我们现在在各大网站论坛都可以看到点击一个QQ图标就可以利用自己的QQ号在网站进行登录了,下面我来告诉你一段QQ登录集成到自己网站php代码,有需要的朋友可参考. 1.打开open.qq.com 添加创建应用:->输入常规的数据,你会看到对应的APP ID和KEY值,这是对你身份证的唯一的验证. 2.打开 http://connect.qq.com/manage/ 点击->添加网站->输入相关信息,这里比较特别注意的是,回调地址那里填上你域名就可以了以上申核需要一到两天时间,耐心等待. 3

Jeesite单点登录集成cas另加自定义登录验证

Jeesite单点登录集成Cas另加自定义登录验证 JeeSite是基于多个优秀的开源项目,高度整合封装而成的高效,高性能,强安全性的 开源 Java EE快速开发平台. Cas主要是用来解决多应用之间统一登陆认证,无需用户在同一公司多应用之间重复登陆.例如阿里巴巴中淘宝.天猫,在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统. Cas基础 服务端 服务端cas-server-webapp-4.0.0.war,服务器端程序一般不用我们完成,但需要做一点小小的修改,cas的服务

(HTTPS)-tomcat 实现 https 登录,去掉端口号

最近项目组要给日本客户做个产品,升级服务器交由我来升级.为了测试用,想要在自己电脑上搭个服务器. 服务器需要由https登录,并且不显示端口号. 费了些劲儿,看了n多帖子,好不容易弄好了.趁在没忘记之前,记录一下,发扬资源共享的作风. 1.首先你的有tomcat 并且好使. 我用的是apache-tomcat-6.0.10. 2.在tomcat的 conf 下面有个server.xml 文件,其中有这样一段话,就是配置ssl 的, <!--      <Connector port="

GS使用HTTPS登录的设置过程

1. Windows 增加角色服务 服务器配置管理器, 添加角色服务 增加角色功能里面有: 证书颁发机构 证书颁发机构 web注册 2. AD CS配置 主要是next操作 独立ca 根证书 等 3. inetmgr申请证书 在机器名的一层及上面申请证书 保存证书信息 用来使用CA机构进行签名 使用高级申请证书,输入base64的数据 使用管理工具-证书管理机构颁发证书 浏览器下载证书 进入IIS 完成服务器证书申请输入好记的名称. 4. 绑定443 更改默认站点设置 default web s

直播APP开发,扩展类库用户、会话和第三方登录集成

直播APP开发扩展类库用户.会话和第三方登录集成,允许我将些扩展类库进行开源.原来此类库的功能只是当前开发项目中的功能,我现将其抽离成可配置使用的扩展类库,以供大家共享.此类库主要特点有:1.可以和第三方登录集成,包括:微信登录.微博登录.QQ登录2.为客户端提供了直接可以调用的登录接口3.为服务端提供了直接可以检测用户登录态的操作4.支持token落地.高效缓存和分布式的数据库存储5.展示了如何开发一个项目级的类库.包括数据库配置.翻译等温馨提示:此扩展类库还在开发完善中,但已有项目在使用,感

Ubuntu 忘记系统登录密码,如何修改密码

Ubuntu 忘记系统登录密码,如何修改密码. 1.重新启动,按ESC键进入Boot Menu,选择recovery mode(一般是第二个选项). 2.在#号提示符下用cat /etc/shadow,看看用户名. 3.输入passwd “用户名”(引号要有的哦). 4.输入新的密码. 5.重新启动,用新密码登录. PS:在修改密码时可能会提示修改失败,可能时只读到权限问题引起到,需要更改一下权限如下: mount -o remount, rw / 在执行第3步.

【Struts2+Hibernate3+Spring3】利用SSH整合,完成打印用户表,用户登录、注册、修改密码系统

本文视图尽可能不杂糅其它技术,尽可能少写代码,完成SSH整合.以致于各位在现有网上资料越来越天花龙凤之下,清晰地了解到传说中的三大框架SSH是怎么整合的. 一.SSH的下载 首先SSH的下载就已经是一个难点.SSH三个地方同时推出各自的新技术,已经要求利用Maven完成其版本的同步.毕竟Spring的版本,决定其能整合什么版本的Struts与Hibernate.Spring3.0.5就不能整合Hibernate4.x了.因此本文选取的SSH的版本,分别为struts 2.3.20 GA.Hibe

JEESZ分布式框架单点登录集成方案

第一节:单点登录简介 第一步:了解单点登录 SSO主要特点是: SSO应用之间使用Web协议(如HTTPS) ,并且只有一个登录入口. SSO的体系中有下面三种角色: 1) User(多个) 2) Web应用(多个) 3) SSO认证中心(一个) SSO实现包含以下三个原则: 1) 所有的登录都在 SSO 认证中心进行. 2) SSO认证中心通过一些方法来告诉Web应用当前访问用户究竟是不是通过认证的用户. 3) SSO认证中心和所有的 Web 应用建立一种信任关系. CAS的基本原理CAS(C