在做登錄界面時灸蟆,有很多關(guān)于安全驗證的方法曼验,比如:
1卡骂、可以使用Session來實現(xiàn)安全驗證
2勾拉、對請求的接口的參數(shù)進行加密的簽名驗證
3煮甥、使用JWT實現(xiàn)接口的驗證
基于Session的安全驗證
Session存儲在服務(wù)器中,用戶較少的話可以使用該類簡單的安全驗證機制藕赞,但是涉及到跨域就需要進行一些配置成肘,用戶量大的話存在一定情況的風(fēng)險。對請求參數(shù)進行加密的簽名驗證
該方法的優(yōu)點在于:1找默、url參數(shù)防篡改 2艇劫、sign 防重放 3吼驶、身份是否合法
前端通過設(shè)置不同的規(guī)則惩激,將傳遞的參數(shù)進行處理:
1、對參數(shù)按照key=value的格式蟹演,并按照參數(shù)名ASCII字典序排序:
2风钻、拼接API密鑰生成Sign:
3、發(fā)送新的數(shù)據(jù)使用JWT實現(xiàn)接口的驗證
JWT是目前主流的跨域身份驗證的解決方法酒请,也是常用的一種安全驗證機制骡技。
nodejs中使用JWT實現(xiàn)接口的安全驗證:
1、安裝jsonwebtoken
cnpm install jsonwebtoken --save
2羞反、生成token
var jwt = require('jsonwebtoken');
router.get('/',function(req,res,next){
var token = jwt.sign({name:'admin'},'sign',{
expiresIn: 60
});
res.send(token);
})
3布朦、安裝basic-auth
cnpm install basic-auth --save
4、獲取請求頭里面的token
router.get('/addressList',function(req,res,next){
var token = auth(req);
})
router.get('/addressList', function (req, res, next) {
var tooken = auth(req);
if (tooken) {
try {
var power= jwt.verify(token.name, 'sign');
console.log( power);
if ( power) {
res.send('有權(quán)限');
} else {
res.send('沒有權(quán)限');
}
} catch (error) {
res.send(error);
}
}else{
res.send('沒有權(quán)限');
}
});
5昼窗、Vue React Angular 使用 Axios 訪問基于 Jwt 的接口
axios.get("http://localhost:3000/api/list", {
auth: {
username:"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJuYW1lIjoi5byg5LiJIiwiaWF0IjoxNTcxMTIwNTE3LCJleHAiOjE1NzExMjIzMTd9.Kcbvg7AGqZlmVyUb8CKyO3fqf-zEwqIWEN2nsUSl17Q",
password: "123456"
}
}).then(function(response) {
// handle success
console.log(response);
}).catch(function(error) {
// handle error
console.log(error);
}).finally(function() {
// always executed
})
- JWT的優(yōu)點:
由于服務(wù)器不保存 session 狀態(tài)是趴,因此無法在使用過程中更改 token 的權(quán)限。也就是說澄惊,一旦 JWT 簽發(fā)了唆途,在到期之前就會始終有效富雅。JWT 不僅可以用于認(rèn)證,也可以用于交換信息肛搬。使用 JWT可以降低服務(wù)器查詢數(shù)據(jù)庫的次數(shù)没佑。