身份驗證 session-cookie
身份驗證
HTTP是一種沒有狀態的協議,也就是它並不知道是誰訪問。客戶端使用者名稱密碼通過了身份驗證,不過下次這個客戶端再發送請求的時候還得驗證。
Session會話支援
會話:一種持久的網路協議,用於完成伺服器和客戶端之間的一些互動行為。
一次會話可能會包含多次連結,每次連線都會被認為是會話的一次操作。HTTP 協議是無狀態的,本身不支援會話,因此在沒有額外手段的幫助下,前面場景中伺服器不知道使用者購買了什麼。
為了在無狀態的HTTP協議之上實現會話,cookie誕生了。Cookie是一些儲存在客戶端的資訊,每次連線的時候由瀏覽器向伺服器遞交,伺服器也向瀏覽器發起儲存cookie
伺服器生成一個唯一識別符號併發送給客戶端瀏覽器,瀏覽器將這個唯一識別符號儲存在 Cookie 中,以後每次再發起請求,客戶端瀏覽器都會向伺服器傳送這個唯一識別符號,伺服器通過這個唯一識別符號來識別使用者。 對於開發者來說,我們無須關心瀏覽器端的儲存,需要關注的僅僅是如何通過這個唯一識別符號來識別使用者。很多服務端指令碼語言都有會話功能,如 PHP,把每個唯一識別符號儲存到檔案中。
Session和cookie互動的過程
1、客戶端使用者名稱跟密碼請求登入
2、服務端收到請求,去資料庫驗證使用者名稱與密碼
3、驗證成功後,服務端種一個cookie或發一個字元到客戶端,同時伺服器保留一份session
4、客戶端收到 響應 以後可以把收到的字元存到cookie
5、客戶端每次向服務端請求資源的cookie會自動攜帶
6、服務端收到請求,然後去驗證cookie和session,如果驗證成功,就說明客戶端已經登入
後端儲存資訊給瀏覽器
伺服器給瀏覽器一個cookie:cookie-parser中介軟體(express腳手架已經整合)
伺服器給瀏覽器cookie的同時在伺服器上生產session:cookie-session中介軟體。
安裝cookie-session中介軟體
npm i cookie-seeion -S
在app.js 中引入
// 伺服器 支援session 前後端不分離 let cookieSession = require('cookie-session') app.use( cookieSession({ secret: "zz2003", //對session id 相關的cookie 進行簽名 cookie: { maxAge: 20 * 60 * 1000 },// 設定 session 的有效時間,單位毫秒 resave: true, //重新儲存:強制會話儲存即使是未修改的。預設為true但是得寫上 saveUnintialized: true, // 是否儲存未初始化的會話 }) );
在腳手架中routes/index.js中寫下:
/* GET home page. */ // get localhost:3000 router.get('/', function(req, res, next) { console.log('index') console.log(req.session) // 當用戶訪問首頁的時候,伺服器會生成一個session 資訊儲存到客戶端裡面 console.log(req.session.id) //session 的唯一識別符號 身份證,會已加密的形式在使用者電腦上存一份,伺服器記憶體也會存一份 // 我們也可以在在sesson中存資訊,只要是同一個使用者session裡的資訊會儲存到伺服器 //使用者第一次訪問的時候我們在session中存 一個views=1 記錄使用者的訪問次數 //使用者不是第一次訪問的時候我們讓views++ if(req.session.views){ req.session.views++ }else{ req.session.views = 1; } // req.session.isLogin = true //在頁面中把views的值渲染到頁面上 // res.render('index', { title: 'Express',views:req.session.views }); // });
在index.ejs中可以將view渲染到頁面上,程式碼如下:
<!DOCTYPE html> <html> <head> <title><%= title %></title> <link rel='stylesheet' href='/stylesheets/style.css' /> </head> <body> <h1><%= title %></h1> <p>Welcome to <%= title %></p> <p>您的訪問次數 <%= views %></p> </body> </html>
在服務上執行的結果如下:
Cookie中也有值:
每重新整理一次終端中會更新一次
這種機制sessionid 也就是登入憑證是伺服器 偷偷存在瀏覽器的,客戶端不需要做什麼操作!客戶端在登入網站的時候,伺服器偷偷存到瀏覽器!