最近研究了下基於token的身份驗證,並將這種機制整合在個人專案中。現在很多**的認證方式都從傳統的seesion+cookie轉向token校驗。對比傳統的校驗方式,token確實有更好的擴充套件性與安全性。
由於http是無狀態的,它並不記錄使用者的身份。使用者將賬號與密碼傳送給伺服器後,後台通過校驗,但是並沒有記錄狀態,於是下一次使用者的請求仍然需要校驗身份。為了解決這一問題,需要在服務端生成一條包含使用者身份的記錄,也就是session,再將這條記錄傳送給使用者並儲存在使用者本地,即cookie。接下來使用者的請求都會帶上這條cookie,若客戶端的cookie與服務端的session能對應上,則說明使用者身份驗證通過。
流程大致如下:
- 第一次請求時,使用者傳送賬號與密碼
- 後台校驗通過,則會生成乙個有時效性的token,再將此token傳送給使用者
- 使用者獲得token後,將此token儲存在本地,一般儲存在localstorage或cookie
- 之後的每次請求都會將此token新增在請求頭里,所有需要校驗身份的介面都會被校驗token,若token解析後的資料報含使用者身份資訊,則身份驗證通過。
對比傳統的校驗方式,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
});
本示例使用的公鑰與私鑰可自己生成,操作如下:
1. 開啟命令列工具,輸入openssl,開啟openssl;
2. 生成私鑰:genrsa -out rsa_private_key.pem 2048
3. 生成公鑰:rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem
閱讀原文
點此檢視node後台**
點此檢視前端**
SpringBoot實現基於token的登入驗證
springboot實現基於token的登入驗證 基於token的登入驗證實現原理 客戶端通過使用者名稱和密碼呼叫登入介面,當驗證資料庫中存在該使用者後,將使用者的資訊按照token的生成規則,生成乙個字串token,返回給客戶端,客戶端在呼叫其他介面的時候,需要在請求頭上帶上token,來驗證登入...
springboot基於token實現登入認證
最近因為專案需求,需採用token的方式實現登入認證,而不再使用session的方式登入,因而採用springboot整合jwt生成token實現登入認證。1.首先新增jwt所需jar包 io.jsonwebtoken groupid jjwt artifactid 0.7.0 version de...
JWT實現基於token的鑑權
2018年01月25日 17 59 15 2.一般放在http的headers 引數裡面的authorization裡面,值的前面加bearer關鍵字和空格。3.主要用於身份認證和資訊交換 4.由三部分組成,用英文句點連線 例如 yyyyyy.zzzzzz payload.signature 由小數...