標籤:node.js session cookie 身分識別驗證 使用者登陸
1.身分識別驗證和使用者登陸
在一般的Web應用上,如果要實現使用者登陸,最常用,也是最簡單的方法就是使用Session,基本的思路是在Session中保留一些使用者身份資訊,然後每次在Session中取,如果資訊不正確或不存在,那麼身分識別驗證失敗,正確則成功。
Session和Cookie是兩個很相似的東西,都是字串,只不過Session是儲存在伺服器上的,而Cookie是儲存在本地的,所以Cookie是不能用作身分識別驗證的。Session故名思議,肯定和用戶端與伺服器間建立的會話相關,Session的工作過程也是如此,每當用戶端和伺服器上的一個網站建立了會話後,就會產生Session在伺服器上,只不過Session裡有沒有相關的資訊,就要看使用者的提交操作了。
Session的區分是按照伺服器給的SessionID來進行的,不同種類的伺服器SessionID不同,以下列舉幾種SessionID:
①使用ASP.NET的IIS伺服器:ASP.NET_SessionId
②使用Java的Tomcat伺服器:JSESSIONID
利用Session進行的身分識別驗證過程:
開啟了Session支援的伺服器在用戶端開始會話的時候,產生一個SessionID,並且在響應(Response)頭(Headers)中的Set-Cookie欄位設定一個Cookie,Cookie的內容就是SessionID和Cookie的路徑(path),在後繼的會話中,用戶端瀏覽器會自動附上Set-Cookie中的SessionID以向伺服器表明身份,伺服器根據SessionID在自己的儲存中尋找相關使用者資訊,並完成驗證過程。
那麼使用者登陸的過程也就是使用者對伺服器提交使用者名稱、密碼等資訊,擷取SessionID的過程。
2.如何類比實現使用者登陸
類比使用者登陸,不是為了進行暴力破解,而是為了越過某些網站的身分識別驗證,然後擷取所需資訊,就比如說學校的圖書館,如果在程式中想要擷取讀者的借閱資訊,因為程式不會像瀏覽器那樣自動帶上SessionID,那麼就必須將使用者名稱和密碼提交至伺服器,獲得到SessionID以後,對後繼的請求帶著SessionID去請求其他頁面,才能擷取到借閱資訊,大致流程如下:
3.Node.js中的具體實現
我在Node.js中使用了request包來簡化請求操作,當然,用原生的http包也是沒有問題的,為了開發效率,還是採用一些npm包為好,話不多說,先上代碼
request( { url: 'http://222.24.3.7:8080/opac_two/include/login_app.jsp', //請求的URL method: 'POST', //POST方式請求 encoding: null, //由於Node預設是UTF-8,而圖書館用的GB2312,所以不進行轉碼 headers: { //要求標頭的設定 ContentType: 'application/x-www-form-urlencoded' }, form: { //請求體,參數 login_type: 'barcode', barcode: username, //提交使用者名稱 password: password, //提交密碼 _: '' //其他參數 } }, function (err, res, body) { //接收回調 body = iconv.decode(body, "GB2312"); //轉碼 //console.log(body); session = res.headers['set-cookie']; //擷取set-cookie欄位值 //console.log(session); if (body == 'ok') { callback({Result: true, Session: session}); } else { callback(false); //回調 } } );上面的代碼是一個使用者登陸的請求樣本,採用了URL轉碼的參數提交方式,提交使用者名稱和密碼給伺服器,伺服器是西郵圖書館的借閱資訊查詢網站。其中3~15行為請求的構建,包含要求標頭、請求體(參數),具體的寫法請參見request的官方文檔。
後面的回呼函數用於接收伺服器回傳的響應,其中就有我們需要的SessionID。
接著,我們來看如何帶上SessionID進行後繼的請求
request( { uri: 'http://222.24.3.7:8080/opac_two/reader/jieshulishi.jsp', //構建請求 encoding: null, //不轉碼 headers: { Cookie: session //這裡是關鍵,設定Cookie為之前請求到的以Cookie形式呈現的SessionID } }, function (err, res, body) { //擷取響應即可 if (err) { callback('Server Error'); } });上面代碼中,最關鍵的就是6~8行中,對要求標頭的設定,也是對Cookie的設定,這裡必須設定為傳遞使用者名稱及密碼進行登陸後返回的內容為SessionID的Cookie,無論是什麼網站,只要採用Session進行身分識別驗證,就可以使用這種方式從程式中,類比使用者資料的提交,從而擷取需要身分識別驗證頁面的資訊。我們只要在響應中對body的內容進行分析,即可抓取HTML中的資訊,Node.js真是方便!
轉載請註明出處,http://blog.csdn.net/yuanguozhengjust/article/details/37601757