最近研究了下基於token的身份驗證,並將這種機制整合在個人專案中。現在很多**的認證方式都從傳統的seesion+cookie轉向token校驗。對比傳統的校驗方式,token確實有更好的擴充套件性與安全性。
傳統的session+cookie身份驗證
由於http是無狀態的,它並不記錄使用者的身份。使用者將賬號與密碼傳送給伺服器後,後台通過校驗,但是並沒有記錄狀態,於是下一次使用者的請求仍然需要校驗身份。為了解決這一問題,需要在服務端生成一條包含使用者身份的記錄,也就是session,再將這條記錄傳送給使用者並儲存在使用者本地,即cookie。接下來使用者的請求都會帶上這條cookie,若客戶端的cookie與服務端的session能對應上,則說明使用者身份驗證通過。
token身份校驗
流程大致如下:
第一次請求時,使用者傳送賬號與密碼
後台校驗通過,則會生成乙個有時效性的token,再將此token傳送給使用者
使用者獲得token後,將此token儲存在本地,一般儲存在localstorage或cookie
之後的每次請求都會將此token新增在請求頭里,所有需要校驗身份的介面都會被校驗token,若token解析後的資料報含使用者身份資訊,則身份驗證通過。
對比傳統的校驗方式,token校驗有如下優勢:
在基於token的認證,token通過請求頭傳輸,而不是把認證資訊儲存在session或者cookie中。這意味著無狀態。你可以從任意一種可以傳送http請求的終端向伺服器傳送請求。
可以避免csrf攻擊
當在應用中進行 session的讀,寫或者刪除操作時,會有乙個檔案操作發生在作業系統的temp 資料夾下,至少在第一次時。假設有多台伺服器並且 session 在第一台服務上建立。當你再次傳送請求並且這個請求落在另一台伺服器上,session 資訊並不存在並且會獲得乙個「未認證」的響應。我知道,你可以通過乙個粘性 session 解決這個問題。然而,在基於 token 的認證中,這個問題很自然就被解決了。沒有粘性 session 的問題,因為在每個傳送到伺服器的請求中這個請求的 token 都會被攔截。
下面介紹一下利用node+jwt(jwt教程)搭建簡易的token身份校驗
示例
當使用者第一次登入時,提交賬號與密碼至伺服器,伺服器校驗通過,則生成對應的token,**如下:
const fs = require(
'fs'
);
const path = require(
'path'
);
const jwt = require(
'jsonwebtoken'
);
//生成token的方法
function
generatetoken(data), cert, );
return
token;
}
//登入介面
router.post(
'/oa/login'
, async (ctx, next) => = data;
let sql =
'select uid from t_user where name=? and password=? and is_delete=0'
, value = [name, md5(password)];
await db.query(sql, value).then(res => );
ctx.body =
}
}
else
}).
catch
(e => );
});
使用者通過校驗將獲取到的token存放在本地:?
store.set(
'loginedtoken'
,token);
//store為外掛程式
之後客戶端請求需要驗證身份的介面,都會將token放在請求頭里傳遞給服務端:?
service.interceptors.request.use(config => ;
let loginedtoken = store.get(
'loginedtoken'
);
let time = date.now();
let = config;
headers = ;
params = ;
config = ;
return
config;
}, error => )
服務端對所有需要登入的介面均攔截token並校驗合法性。?
function
verifytoken(token)) || {};
let = result,current = math.floor(date.now()/1000);
if
(current <= exp);
}
}
catch
(e)
return
res;
}
let = ctx;
if
(url.indexof(
'/user/'
) > -1) = header;
if
(loginedtoken) = result;
if
(uid);
await next();
}
else
}
else
}
else
});
本示例使用的公鑰與私鑰可自己生成,操作如下:
開啟命令列工具,輸入openssl,開啟openssl;
生成私鑰:genrsa -out rsa_private_key.pem 2048
生成公鑰: rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem
點此檢視node後台**
點此檢視前端**
文章出處:
session cookie和cache的區別
其中cookie是儲存在客戶端的一組資料,主要用來儲存使用者名稱等個人資訊。session session用來儲存每乙個使用者的專有資訊 session的生存期是使用者持續請求時間加上一段時間 一般是20分鐘左右 session資訊是儲存在web伺服器記憶體中的,儲存資料量可大可小 由於使用者停止使...
session cookie 和token登入驗證
最近研究了下基於token的身份驗證,並將這種機制整合在個人專案中。現在很多 的認證方式都從傳統的seesion cookie轉向token校驗。對比傳統的校驗方式,token確實有更好的擴充套件性與安全性。傳統的session cookie身份驗證 由於http是無狀態的,它並不記錄使用者的身份。...
session cookie和token的區別
web應用程式是使用http協議來傳送資料的。而http是無狀態的協議。所以一旦http報文交換完成,客戶端和伺服器端就會誰也不認識誰了,這意味著伺服器無法從連線上跟蹤會話。即當使用者a購買了一件商品並放入購物車中,當再次購買該商品時,伺服器已經無法判斷是哪個使用者的會話了,所以才必須引入一種機制用...