使用QNetworkAccessManager通过HTTPS下载文件:如何进行身份验证?

时间:2014-07-14 15:15:10

标签: windows qt authentication https qnetworkaccessmanager

您可以在任何地方找到的一般答案是使用Signal authenticationRequired(QNetworkReply*, QAuthenticator*),然后将登录凭据填充到给定的QAuthenticator对象中。

然而,这在我的情况下不起作用,因为该信号永远不会发出。原因:服务器未返回授权失败,而是将我重定向到登录页面。所以我的程序只会下载该页面。

我已经找到了如何通过检查QNetworkReply的属性QNetworkRequest::RedirectionTargetAttribute来捕获它。 所以我可以检测到重定向并要求用户提供身份验证信息。

但是......我从哪里去?如何设置身份验证数据?我可以手动设置QAuthenticator到我的QNetworkRequest或我的QNetworkAccessManager吗?我没有找到办法在任何地方做到这一点,只是通过上面提到的信号/插槽机制,因为它不会触发,因此不起作用。

非常感谢任何帮助!

1 个答案:

答案 0 :(得分:0)

来自文档,

http://qt-project.org/doc/qt-5/qauthenticator.html

  

QAuthenticator支持以下身份验证方法:

     
      
  • 基本
  •   
  • NTLM第2版
  •   
  • 文摘-MD5
  •   

由于您被重定向到登录页面,并且您尚未指出上述任何一种身份验证方法是否有效,我将假设它不会,因为发送了基本身份验证之类的内容对服务器的每个请求。登录页面通常对客户端进行身份验证,并使用某种cookie进行身份验证。为此,

  1. 检测登录页面
  2. 将适当的凭据传递给服务器(基于表单需要的内容)
  3. 在QNetworkReply到登录页面,查找cookie(Set-Cookie标题)。
  4. 根据您的要求传回相关的Cookie。
  5. 如果有效,则不再重定向到登录页面。
  6. 有关Cookie的信息,您可以通过Wikipedia获取概述,但要实施,您需要查看RFC 6265

    如果这不正确,并且您可以使用基本身份验证,则该信息将在URL本身中传递。在QUrl中设置用户名和密码,如果有效,则不会重定向。 http://qt-project.org/doc/qt-5/qurl.html#setPassword