2014-07-14 91 views
1

您可以在任何地方找到的一般答案是使用Signal authenticationRequired(QNetworkReply*, QAuthenticator*),然後將登錄憑證填充到給定的QAuthenticator對象中。使用QNetworkAccessManager通過HTTPS下載文件:如何進行身份驗證?

但是,這不適用於我的情況,因爲該信號永遠不會發射。原因:服務器不返回授權失敗,而是將我重定向到登錄頁面。所以我的程序只會下載那個頁面。

我已經發現如何通過檢查QNetworkReply的屬性QNetworkRequest::RedirectionTargetAttribute來解決這個問題。 所以我可以檢測到重定向並詢問用戶身份驗證信息。

但是......我從哪裏去?我如何設置驗證數據?我可以手動將QAuthenticator設置爲我的QNetworkRequest或我的QNetworkAccessManager?我沒有找到辦法做到這一點,只是通過上面提到的信號/插槽機制,因爲它不會觸發不起作用。

任何幫助將不勝感激!

回答

0

從技術文檔,

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

QAuthenticator支持以下身份驗證方法:

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

既然你是被重定向到登錄頁面,如果上述任何身份驗證方法,即使工作中,我將假設,它並沒有因爲類似的事情基本身份驗證是在每發送您還沒有表示請求到服務器。登錄頁面通常會對客戶端進行身份驗證,並使用某種cookie用於未來的身份驗證。要做到這一點,

  1. 檢測登錄頁面
  2. 傳遞正確的憑據到服務器(基於表單想要什麼)
  3. 在QNetworkReply到登錄頁面,查找餅乾(設置Cookie頭) 。
  4. 將相關cookie傳遞迴您的請求。
  5. 如果有效,您將不再被重定向到登錄頁面。

有關Cookie的信息,您可以通過Wikipedia得到概述,但對於實現,需要看RFC 6265

如果這是不正確的,你可以使用基本身份驗證,然後將這些信息是傳遞給URL本身。在你的QUrl中設置用戶名和密碼,如果它起作用,你將不會被重定向。 http://qt-project.org/doc/qt-5/qurl.html#setPassword

+0

感謝您的回覆。我想我可以建立一些你建議用於服務器和登錄表單的東西(「2.根據表單需要將正確的憑證傳遞給服務器」)。但是這不是一個令人滿意的解決方案,因爲我希望它能夠與任何https連接一起工作。 至於auth方法:我嘗試只傳遞基本身份驗證與網址,這是行不通的。至於NTLM 2和Digest-MD5,我甚至不知道......我無法嘗試,因爲我無法將認證信息傳遞給服務器。 – user3782412

+0

好吧,我最終做了你的建議,除了用POST所需的登錄憑證來做POST之外 - 這很難做到,因爲這個POST必須專門針對登錄頁面的需求 - 我使用一個QWebView(連接我的QNetworkAccessManager)只顯示登錄頁面本身。用戶必須登錄,然後才能從Access Manager的QNetworkCookieJar獲取cookie,並將其傳遞給新的下載請求。 它應該適用於任何頁面,因爲我使用的是原始登錄機制。 再次感謝您的幫助! – user3782412

相關問題