在做登錄界面時(shí),有很多關(guān)于安全驗(yàn)證的方法,比如:
1、可以使用Session來(lái)實(shí)現(xiàn)安全驗(yàn)證
2、對(duì)請(qǐng)求的接口的參數(shù)進(jìn)行加密的簽名驗(yàn)證
3、使用JWT實(shí)現(xiàn)接口的驗(yàn)證
基于Session的安全驗(yàn)證
Session存儲(chǔ)在服務(wù)器中,用戶較少的話可以使用該類簡(jiǎn)單的安全驗(yàn)證機(jī)制,但是涉及到跨域就需要進(jìn)行一些配置,用戶量大的話存在一定情況的風(fēng)險(xiǎn)。對(duì)請(qǐng)求參數(shù)進(jìn)行加密的簽名驗(yàn)證
該方法的優(yōu)點(diǎn)在于:1、url參數(shù)防篡改 2、sign 防重放 3、身份是否合法
前端通過(guò)設(shè)置不同的規(guī)則,將傳遞的參數(shù)進(jìn)行處理:
1、對(duì)參數(shù)按照key=value的格式,并按照參數(shù)名ASCII字典序排序:
2、拼接API密鑰生成Sign:
3、發(fā)送新的數(shù)據(jù)使用JWT實(shí)現(xiàn)接口的驗(yàn)證
JWT是目前主流的跨域身份驗(yàn)證的解決方法,也是常用的一種安全驗(yàn)證機(jī)制。
nodejs中使用JWT實(shí)現(xiàn)接口的安全驗(yà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、獲取請(qǐng)求頭里面的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)點(diǎn):
由于服務(wù)器不保存 session 狀態(tài),因此無(wú)法在使用過(guò)程中更改 token 的權(quán)限。也就是說(shuō),一旦 JWT 簽發(fā)了,在到期之前就會(huì)始終有效。JWT 不僅可以用于認(rèn)證,也可以用于交換信息。使用 JWT可以降低服務(wù)器查詢數(shù)據(jù)庫(kù)的次數(shù)。