標籤:
簡介
HttpClient支援三種不同形式的HTTP協議驗證發難:Basic,Digest和NTLM。這些都可以解決同http伺服器或是Proxy 伺服器之間的認證。
證明伺服器
HttpClient處理伺服器認證幾乎是透明的,發開者只需要做一件事情,提供一個合法login認證。此認證被儲存到HttpState執行個體中並且可調用方法setCredentials(AuthScopeauthscope, Credentials cred)和getCredentials(AuthScope authscope)方法設定和得到。
HttpClient的內建自動認證機制可通過HttpMethod類中的setDoAuthentication(boolean doAuthenticaiton)方法廢棄掉。這樣做你只會影響到method的執行個體。
Preemptive Authentication(搶先認證)
用HttpClient可以實現Preemptive authenticaiton。這種方式HttpClient會發送基本的認證Response,有些情況下,會在伺服器返回一個未經授權的Response之前就發出去,從而使串連減少了開銷。你可以像下面這樣使用它
client.getParams().setAuthenticationPreemptive ( true);
這種方式也要求必須為目標伺服器或是Proxy 伺服器設定預設認證。若不能提供預設的認證將會使Preemptive Authentication(搶先認證)的方式失效。
Credentials defaultcreds = new UsernamePasswordCredentials(“username”, “passowrd”);
Client.getState().setCredentials(new AuthScope(“myhost”, 80, AuthScope.ANY_REALM), defaultcreds);
Security aspects of server authentication(安全伺服器驗證)
使用預設認證開發應用時,可能會與安全web網站或是普通web網站進行通訊。當Preemtive authentication被啟用或是認證未給出一個明確的認證領域和主機時,HttpClient嘗試使用預設認證與目標網站去驗證。如果你想避免發送認證去一個不信任的網站儘可能的縮小的認證範圍:始終指定主機。
在正式產品中禁止使用AuthScope.ANY驗證域去設定認證。這樣做會發送所有的認證。
這樣設定方式只應該在debugging階段使用。
// To be avoided unless in debug mode
Credentials defaultcreds = new UsernamePasswordCredentials(“username”, “password”);
Client.getState().setCredentials(AuthScope.ANY, defaultcreds);
Proxy Authentication(代理認證)
Basic
Basic authentication是最原始最和諧的一種認證方案。遺憾的是,這也是最不安全,因為它發送到伺服器的使用者名稱和密碼是沒有經過加密的。Basic authentication需要一個UsernamePasswordCredentials的執行個體去實現,無論是特定領域還是預設的認證。
Digest
Disgest authectication在HTTP1.1協議中添加進來,這種方案並沒有像Basic authectication廣泛的使用起來。Digest authentication明顯要比Basic authentication方案安全,因為它傳送加密以後的使用者名稱和密碼。
Digest authentication需要一個UsernamePasswordCredentials的執行個體。
NTLM
NTLM是HttpClient所支援的最複雜的一種認證協議。這是一個專利協議,由Microsoft設計,也沒有公開其標準。NTLM早期的版本由於設計的錯誤導致安全性較Digest authentication差,然而在Windows NT 4修複了這個BUG,現在認為就安全性要比Digest authenticaiton安全。
轉載:http://blog.csdn.net/mgoann/article/details/4054747
文章來源:HttpClient基於HTTP協議認證方案
HttpClient基於HTTP協議認證方案