使用者資訊認證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(簽名)進行解密。