1. 程式人生 > >使用者資訊認證session和token

使用者資訊認證session和token

在進行使用者資訊認證之前,我們需要先知道兩個知識點:

(1):http是無狀態協議。所以,在進行資訊認證時,我們需要引入狀態機制,也就是session機制。

(2):cookie,與域名有關,域名不變,cookie不變。也就是說,在同一域名下,請求各種資源都會攜帶cookie回後端。

下面來談談兩種認證方式:

1.session(會話)

這種方式依賴於cookie,我們也稱它為setCookie(種cookie)。

原理:當前端發出一次請求時,後端產生一個session ID,後端自動通過response返還給前端,也就是setCookie,使用者請求第二個頁面時,瀏覽器自動通過request攜帶cookie到後端進行比較。

以下步驟為操作過程:

  • 安裝express-session(yarn add express-session)

  • 配置session,一定要在路由之前配置。

    // session 配置,配置在路由之前
    app.use(session({
      secret: 'keyboard cat',
      resave: false,
      saveUninitialized: false,
      cookie: {
        httpOnly: true, 
        secure: false,
        maxAge: 24 * 60 * 60 * 1000
      }
    }))

  • 引入express-session後就直接有了session物件

擴充套件:

由此引出一個新的問題:登入不過期時,使用者關閉瀏覽器再次開啟,首頁面依然保持登入狀態。如何判斷使用者是否登陸過?以下提供兩種解決方案:​

第一種:通過判斷cookie(sessionID)是否存在。缺點:sessionID不攜帶使用者資訊。

第二種:再次請求後端API,判斷req.session.username是否存在,返回給前端一個資訊。
2. 生成token(基於jwt(jsonwebtoken)的認證機制)

(1)生成token

方法一:對稱加密:SH256
方法二:非對稱加密:RS256,私鑰加密,公鑰解密。(github的傳輸就是採用非對稱加密)

(2)後端向前端傳輸資料的方式有四種:

  • get(在queryString中顯示)

  • post(FormData中顯示)

  • 通過自定義路由載荷一個物件

  • 設定響應頭res.header

  要注意最後一種傳輸方式,前端接收時,如果採用jquery中ajax的success:(data,status,xhr)=>{}中的方法來獲取response的頭部資訊會有坑,最好使用.then()方法。

(3)傳遞到前端,利用localstorage.setItem()儲存token。token並不儲存在伺服器端,所以刪除的時候要記得,從哪裡儲存,就在哪裡刪除。

(4)使用者發起請求時,前端要想後端傳遞token,可使用jquery中$.ajax中的header配置。後端用req.header()取出token,進行驗證,利用cert(簽名)進行解密。