HTTP的 Basic 验证
生活随笔
收集整理的這篇文章主要介紹了
HTTP的 Basic 验证
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
什么是HTTP Basic Authentication?在wiki上有詳細的解釋: http://en.wikipedia.org/wiki/Basic_authentication_schemeHTTP Basic Authentication是一個定義在HTTP/1.1規范中的驗證機制。這種機制是以用戶名和密碼為基礎的。一個web server要求一個web client去驗證一個用戶。作為request的一部分,web server 傳遞被稱之為realm的字符串,用戶就是在它里面被驗證的。注意:Basic Authentication機制的realm字符串不一定反映任何一種安全方針域。Web client得到這些用戶名和密碼,然后把它傳遞給web server。Web server然后在一個特定的領域驗證這些用戶。由于密碼是使用一種64位的編碼來傳遞,而且目的server沒有驗證,所以Basic Authentication不是一種安全的驗證協議。在訪問一個需要 HTTP Basic Authentication 的URL的時候,如果你沒有提供用戶名和密碼,服務器就會返回401,如果你直接在瀏覽器中打開,瀏覽器會提示你輸入用戶名和密碼。你可以嘗試點擊這個url看看效果:http://api.minicloud.com.cn/statuses/friends_timeline.xml ?如果想要在發送請求的時候添加 HTTP Basic Authentication 認證信息到請求中,有兩種方法: ?一是在請求頭中添加Authorization:Authorization: "Basic 用戶名和密碼的base64加密字符串" ?二是在url中添加用戶名和密碼: ?http://userName:password@api.minicloud.com.cn/statuses/friends_timeline.xml ?//需要Base64見:http://www.webtoolkit.info/javascript-base64.html ?function make_base_auth(user, password) { ?var tok = user + ':' + pass; ?var hash = Base64.encode(tok); ?return "Basic " + hash; ?} ??var auth = make_basic_auth('QLeelulu','mypassword'); ?var url = 'http://example.com'; ??// 原始JavaScript ?xml = new XMLHttpRequest(); ?xml.setRequestHeader('Authorization', auth); ?xml.open('GET',url) ??// ExtJS ?Ext.Ajax.request({ ?url : url, ?method : 'GET', ?headers : { Authorization : auth } ?}); ??// jQuery ?$.ajax({ ?url : url, ?method : 'GET', ?beforeSend : function(req) { ?req.setRequestHeader('Authorization', auth); ?} ?});?HTTP基本認證(HTTP Basic Athorization)過程分析在HTTP協議進行通信的過程中,HTTP協議定義了基本認證過程以允許HTTP服務器對WEB瀏覽器進行用戶身份證的方法,當一個客戶端向HTTP服務 器進行數據請求時,如果客戶端未被認證,則HTTP服務器將通過基本認證過程對客戶端的用戶名及密碼進行驗證,以決定用戶是否合法??蛻舳嗽诮邮盏紿TTP服務器的身份認證要求后,會提示用戶輸入用戶名及密碼,然后將用戶名及密碼以BASE64加密,加密后的密文將附加于請求信息中, 如當用戶名為anjuta,密碼為:123456時,客戶端將用戶名和密碼用“:”合并,并將合并后的字符串用BASE64加密為密文,并于每次請求數據 時,將密文附加于請求頭(Request Header)中。HTTP服務器在每次收到請求包后,根據協議取得客戶端附加的用戶信息(BASE64加密的用戶名和密碼),解開請求包,對用戶名及密碼進行驗證,如果用 戶名及密碼正確,則根據客戶端請求,返回客戶端所需要的數據;否則,返回錯誤代碼或重新要求客戶端提供用戶名及密碼。整個交互過程如下(模擬個登錄GOOGLE首頁的過程,并假設登錄GOOGLE需要認證):1,客戶端向服務器請求數據,請求的內容可能是一個網頁或者是一個其它的MIME類型,此時,假設客戶端尚未被驗證,則客戶端提供如下請求至服務器:Get /index.html HTTP/1.0Host:www.google.com這段信息表明,客戶端向主機www.google.com請求其位于根目錄下的index.html網頁,使用http1.0協議。2,服務器向客戶端發送驗證請求代碼401,服務器返回的數據大抵如下:HTTP/1.0 401 UnauthorisedServer: SokEvo/1.0WWW-Authenticate: Basic realm="google.com"Content-Type: text/htmlContent-Length: xxx<HTML><HEAD><TITLE>Error</TITLE><META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=ISO-8859-1"></HEAD><BODY><H1>401 Unauthorised.</H1></BODY></HTML>3,當符合http1.0或1.1規范的客戶端(如IE,FIREFOX)收到401返回值時,將自動彈出一個登錄窗口,要求用戶輸入用戶名和密碼。4,用戶輸入用戶名和密碼后,將用戶名及密碼以BASE64加密方式加密,并將密文放入前一條請求信息中,則客戶端發送的第一條請求信息則變成如下內容:Get /index.html HTTP/1.0Host:www.google.comAuthorization: Basic xxxxxxxxxxxxxxxxxxxxxxxxxxxx注:xxxx....表示加密后的用戶名及密碼。5,服務器收到上述請求信息后,將Authorization字段后的用戶信息取出、解密,將解密后的用戶名及密碼與用戶數據庫進行比較驗證,如用戶名及密碼正確,服務器則根據請求,將所請求資源發送給客戶端:HTTP/1.0 200 OKServer: www.google.com/http1.0Content-Type: text/htmlContent-Length: xxxx<html>網頁內容</html>如用戶名及密碼不正確,請返回第2步,重新向客戶端發送用戶驗證請求。6,在以后的整個通信會話中,客戶端均會在請求包中附加入加密后的用戶信息。HTTP基本認證的目標是提供簡單的用戶驗證功能,其認證過程簡單明了,適合于對安全性要求不高的系統或設備中,如大家所用路由器的配置頁面的認證,幾乎 都采取了這種方式。其缺點是沒有靈活可靠的認證策略,如無法提供域(domain或realm)認證功能,另外,BASE64的加密強度非常低,可以說僅 能防止sohu的搜索把它搜到了。當然,HTTP基本認證系統也可以與SSL或者Kerberos結合,實現安全性能較高(相對)的認證系統。想起用basic驗證的服務器端的設置:方式一:在web.xml中配置,可以參考CATALINA_HOME/server/manager/WEB-INF/web.xml方式二:在程序中coding,參考如下:if(request.getHeader("Authorization")==null){?response.setStatus(401);?response.setHeader("WWW-authenticate","Basic realm=\"請輸入管理員密碼\"");?}else if( !(request.getHeader("Authorization").equals(pass))){response.setStatus(401); ? ??response.setHeader("WWW-authenticate","Basic realm=\"用戶名或者密碼錯誤\"");out.print("對不起你沒有權限!!");return;}GET /manager HTTP/1.0Content-Type: application/x-www-form-urlencodedAuthorization: Basic <base64encode(user:pass)>方法一:直接使用new sun.misc.BASE64Encoder().encode(byte[])構造HTTP頭方法二: ?Authenticator.setDefault(new AuthImpl()); 然后使用HttpURLConnection連接即可,這種方式更靈活class AuthImpl extends Authenticator {protected PasswordAuthentication getPasswordAuthentication() {String user = "admin";char pass[] = "admin".toCharArray();nginx配置雖然resin的配置也可以達到效果,但是畢竟是配置到了工程文件中,以后定期更換用戶名與密碼,都得更新項目描述符;而且有個更要命的問題,如果一個resin上有多個項目的話,一次更新就需要修改所有相關項目的web.xml文件,太麻煩了。在nginx上也可以配置basic認證,而且更簡單。nginx的http basic認證密碼是用crypt(3)加密的,可以試用apache的htpasswd生成密碼文件。首先進入apache的安裝目錄,進入apache/bin/目錄下,可以看到htpasswd,輸入如下命令生成密碼文件。htpasswd -c -d pass_file user_name其中-c表示生成文件,-d表示是以crypt加密,pass_file是密碼文件名,user_name表示basic認證的用戶名,回車后會提示輸入密碼,然后再次輸入確認,生成密碼文件完成。然后就是配置nginx,nginx的認證需要配置到location下,如下所示。location ~ /admin/manage {auth_basic ?"Auth";auth_basic_user_file ?pass_file;}其中Auth可以隨意設置,它只不過是當需要認證時彈出窗口的服務顯示名稱而已,pass_file就是我們之前生成的密碼文件,這里要注意nginx 0.6.7開始,auth_basic_user_file的相對目錄是nginx_home/conf,以前版本的相對目錄是nginx_home,現在只要訪問包含/admin/manage路徑的資源都會彈出認證框,而且對于一個nginx代理了n個web服務的情況,需要更換用戶名與密碼時,只需要將密碼文件替換一次即可,比第一種方式方便可靠了很多。
轉載于:https://www.cnblogs.com/lechie/archive/2012/03/13/2393531.html
總結
以上是生活随笔為你收集整理的HTTP的 Basic 验证的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 游艇租用
- 下一篇: python长代码_Python 的长代