1. 程式人生 > 實用技巧 >身份驗證 session-cookie

身份驗證 session-cookie

身份驗證

  HTTP是一種沒有狀態的協議,也就是它並不知道是誰訪問。客戶端使用者名稱密碼通過了身份驗證,不過下次這個客戶端再發送請求的時候還得驗證。

Session會話支援

  會話:一種持久的網路協議,用於完成伺服器和客戶端之間的一些互動行為。

  一次會話可能會包含多次連結,每次連線都會被認為是會話的一次操作。HTTP 協議是無狀態的,本身不支援會話,因此在沒有額外手段的幫助下,前面場景中伺服器不知道使用者購買了什麼。

 為了在無狀態的HTTP協議之上實現會話,cookie誕生了。Cookie是一些儲存在客戶端的資訊,每次連線的時候由瀏覽器向伺服器遞交,伺服器也向瀏覽器發起儲存cookie

的請求。

  伺服器生成一個唯一識別符號併發送給客戶端瀏覽器,瀏覽器將這個唯一識別符號儲存在 Cookie 中,以後每次再發起請求,客戶端瀏覽器都會向伺服器傳送這個唯一識別符號,伺服器通過這個唯一識別符號來識別使用者。 對於開發者來說,我們無須關心瀏覽器端的儲存,需要關注的僅僅是如何通過這個唯一識別符號來識別使用者。很多服務端指令碼語言都有會話功能,如 PHP,把每個唯一識別符號儲存到檔案中。

Sessioncookie互動的過程

  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 也就是登入憑證是伺服器 偷偷存在瀏覽器的,客戶端不需要做什麼操作!客戶端在登入網站的時候,伺服器偷偷存到瀏覽器!