1:客戶端通過用戶名和密碼登錄
2:服務器驗證用戶名和密碼,若通過,生成token返回給客戶端。
3:客戶端收到token後以後每次請求的時候都帶上這個token,相當於一個令牌,表示我有權限訪問了
4:服務器接收(通常在攔截器中實現)到該token,然後驗證該token的合法性。若該token合法,則通過請求,若token不合法或者過期,返回請求401請求失敗。
1.token相比於session,它無需保存在服務器,不佔用服務器內存開銷。
2.token可以在服務器集羣中很好的使用:無狀態、可拓展性強
3.服務器生成的token如下:分爲3部分,以點來分割;
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJuYW1lIjoiaHVzaGl3ZWk1MjAiLCJpZCI6NDYsImlhdCI6MTU5MTM0MDQyNiwiZXhwIjoxNTkxMzQ3NjI2fQ.B-NAeiQPk0iiJRHkBJnodVadUlDXBabXrAyTomVxcww
第一部分:token頭部
頭部(Header),格式如下:
{
“typ”: “JWT”,
“alg”: “HS256”
}
token使用HS256加密算法,將頭部使用Base64編碼可得到:‘eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9’
第二部分:paload: 存放自定義信息;預定義信息有如下幾個;它的編碼:‘eyJuYW1lIjoiaHVzaGl3ZWk1MjAiLCJpZCI6NDYsImlhdCI6MTU5MTM0MDQyNiwiZXhwIjoxNTkxMzQ3NjI2fQ’
iss:該JWT的簽發者
sub:該JWT所面向的用戶
aud:接受該JWT的一方
exp(expires):什麼時候過期,這裏是一個Unix時間戳
iat(issued at):在什麼時候簽發
第三部分,簽名部分;前兩部分都是明文;它的編碼:‘B-NAeiQPk0iiJRHkBJnodVadUlDXBabXrAyTomVxcww’
4.通過這個網站來解碼,網站地址:https://jwt.io/
5.koa中的代碼簽發token如下:
// 用戶名密碼正確後,簽發token
const token = jwt.sign({
name: TextRow[0].username,
id: TextRow[0].id
},"sometokens", {expiresIn: '2h'});
resData = {
info: "用戶名密碼正確",
status: 0,
token: token
}