2013-01-06 79 views
2

我對任何形式的幫助,可以幫助我解決這個問題,萬分感謝。不理解爲什麼WinHTTP不能驗證某些HTTPS資源

從Excel VBA代碼我需要下載&從HTTPS網站https://redmine.itransition.com/解析CSV文件。我嘗試使用WinHTTP來獲取文件。但是,我不明白爲什麼認證不起作用。下面是一段相關代碼:

TargetURL = "https://redmine.itransition.com/projects/pmct/time_entries.csv" 
Set HTTPReq = CreateObject("WinHttp.WinHttpRequest.5.1") 
HTTPReq.Option(4) = 13056 ' WinHttpRequestOption_SslErrorIgnoreFlags 13056: ignore all err, 0: accept no err 
HTTPReq.Open "GET", TargetURL, False 
HTTPReq.SetCredentials "UN", "PW", 0 
HTTPReq.send 

返回以下響應(只有某些字符串列出):

Content-Type: text/html; charset=utf-8 
Status: 406 
X-Runtime: 5 

但是,如果我成功的人工驗證後從Firefox發送cookie「曲奇」串使用

HTTPReq.setRequestHeader "Cookie", SetCookieString 
HTTPReq.send 

我很容易得到預期的文件。當然,我對這樣的解決方案並不滿意,並且想要執行真正的WinHTTP身份驗證。但是,我不明白什麼是錯的,或者我在代碼中錯過了什麼。最有可能我不得不使用.SetClientCertificate方法,但不清楚這個對我來說 - 這證書是必需的?

或者,更加一般:它WinHTTP的方法或函數應該使用調試找出哪些步驟是阻止/不正確的,讓我無法正確的驗證?我花了2周的時間尋求通過MSDN和各種資源,但仍然沒有解決方案。

在此先感謝您的建議!

+0

也許可以幫助:我需要驗證管理平臺實例(見http://www.redmine.org/更多),VER。 1.0.1(相當古老)。 –

+0

的406 HTTP狀態代碼不涉及到身份驗證 - 你應該得到一個401或407的代碼,如果需要認證。 406是 - 「406不可接受:由請求標識的資源只能根據請求中發送的接受標頭生成具有不可接受的內容特徵的響應實體」 - 見http://www.w3.org/Protocols /rfc2616/rfc2616-sec10.html – barrowc

+0

@barrowc感謝您的亮點!實際上,406與auth根本無關 - 在我的上下文中,它意味着我收到的響應不同於200/OK,這是從瀏覽器使用cookie字符串時得到的。還有一個比較有用的鏈接! –

回答

3

登錄https://redmine.itransition.com/只是一個HTML表單,它將用戶名&密碼發佈到/login的腳本中。

這與SetCredentials不兼容,它設計用於基於服務器的身份驗證方案,如basic/digest/ntlm。

您需要加載該頁面沒有憑據,搶什麼用的用戶名密碼&一起/login貌似生成表單&後揮發場authenticity_token

如果它是一個基於會話的系統,它將響應與Set-cookie頭+數據,需要在後續請求中使用。

+0

感謝您的建議 - 我的最後工作的代碼如下! –

6

以上@Alex K.反應正是我一直在尋找SOOOO長! 使用Firebug和MSDN的幫助下,我用3個請求完成:

  • GET請求使用正則表達式
  • POST請求而認證&收集來自登錄頁authenticity_token數據採集所需的cookie字符串從響應
  • GET請求最終得到我心愛的CSV

下面的一段代碼,按預期工作:

Set RegX_AuthToken = CreateObject("VBScript.RegExp") 
' Below Pattern w/o double-quotes encoded: (?:input name="authenticity_token" type="hidden" value=")(.*)(?:") 
RegX_AuthToken.Pattern = "(?:input name=" & Chr(34) & "authenticity_token" & Chr(34) & " type=" & Chr(34) & "hidden" & Chr(34) & " value=" & Chr(34) & ")(.*)(?:" & Chr(34) & ")" 
RegX_AuthToken.IgnoreCase = True 
RegX_AuthToken.Global = True 

TargetURL = "https://redmine.itransition.com/login" 

Set HTTPReq = CreateObject("WinHttp.WinHttpRequest.5.1") 
HTTPReq.Open "GET", TargetURL, False 
HTTPReq.Send 

Set Token_Match = RegX_AuthToken.Execute(HTTPReq.ResponseText) 
AuthToken = Token_Match.Item(0).SubMatches.Item(0) 

PostData = "authenticity_token=" & AuthToken & "&back_url=https://redmine.itransition.com/" & "&username=" & UN & "&password=" & PW & "&login=Login »" 

HTTPReq.Open "POST", TargetURL, False 
HTTPReq.setRequestHeader "Content-Type", "application/x-www-form-urlencoded" 
HTTPReq.Send (PostData) 

SetCookieString = HTTPReq.GetResponseHeader("Set-Cookie") 

TargetURL = "https://redmine.itransition.com/projects/pmct/time_entries.csv" 
HTTPReq.Open "GET", TargetURL, False 
HTTPReq.setRequestHeader "Cookie", SetCookieString 
HTTPReq.Send 

下面的網址是建築POST請求幫助:http://tkang.blogspot.com/2010/09/sending-http-post-request-with-vba.html

您需要加載該頁面沒有憑據,搶什麼樣子 揮發場authenticity_token生成表單&後 沿用戶名爲&密碼登錄。

亞歷克斯K. - 再次感謝您的輝煌建議! (:

0

另外還有一件事(除了上面的解決方案),在使用與上面的代碼類似的POST請求的情況下,應該知道:由於某些不明確的原因,我仍然在4-5次(或。甚至更多)從網站,這意味着在我的情況AUTH討厭的406響應不完整後一步一步的調試時間我愉快地抓住了原因:身份驗證令牌值可能有+跡象,從分析的的幾十身份驗證令牌/響應代碼箭頭我發現+含令牌完全相符406碼

,溶液變得很明顯:安全URL編碼+ ES爲PostData。隨着http://www.blooberry.com/indexdot/html/topics/urlencoding.htm的幫助下,我終於想出了以下內容:

PostData = "authenticity_token=" & Replace(AuthToken, "+", "%2B", vbTextCompare) & _ 
    "&back_url=https://redmine.itransition.com/projects/" & Trim(RedmineProject) & _ 
    "/time_entries" & "&username=" & UN & "&password=" & PW & "&login=Login »" 

+ ES被%2B條取代的,這是 - 沒有更多的406S)

其他特殊字符沒有關係的!我的情況,但經驗教訓。希望這會爲別人節省幾個小時的生命!

+0

我知道這是一箇舊帖子,但需要您的幫助才能從安全站點下載圖片** https://secure.brandbank.com/login.aspx?cookieCheck = true **。我有我的登錄用戶名和密碼,並嘗試了各種方式下載它。我可以在記錄之後手動下載圖像,例如, ** HTTPS://productlibrary.brandbank。com/image/gallerylarge/3520198 **,但不知道如何使用您在authenticity_token上共享的示例下載它。我如何爲它編寫正則表達式並找到它的真實性標記? FYI,** 3520198 **是圖像的名稱。 – sifar786

+0

你是怎麼分別找出正確的'PostData'和'AuthToken.Pattern'的?我試圖從一個安全的網站下載文件,但它不公開URL字符串中的任何內容。我想下載的所有內容是[401](https://msdn.microsoft.com/en-us/library/ms767625(v = vs.85).aspx)+'授權令牌丟失'。我在[pastebin](https://pastebin.com/jhhdL4UC)上放置了登錄頁面的'ResponseText' 和'GetAllResponseHeaders()'。我找不到與授權令牌相關的任何內容。 – Stefan

相關問題