JWT 是一個(gè)方便的一種實(shí)現(xiàn)服務(wù)器與客服端安全通訊的一種規(guī)范方案,當(dāng)然基于 JWT 的概念自
己可以實(shí)現(xiàn)安全的加密方案,另外也可以重復(fù)造一些輪子。
1.安裝
$ npm install jsonwebtoken --save
2.我們先來看加密與解密方法:
const jwt = require('jsonwebtoken');
const secret = 'aaa'; //撒鹽:加密的時(shí)候混淆
//jwt生成token
const token = jwt.sign({
name: 123
}, secret, {
expiresIn: 60 //秒到期時(shí)間
});
console.log(token);
//解密token
jwt.verify(token, secret, function (err, decoded) {
if (!err){
console.log(decoded.name); //會(huì)輸出123,如果過了60秒,則有錯(cuò)誤。
}
})
我們看看jwt.sign 生成的token:
【eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJuYW1lIjoxMjMsImlhdCI6MTQ5MTQ3NTQyNCwiZXhwIjoxNDkxNDc1NDg0fQ.hYNC4qFAyhZClmPaLixfN137d41R2CFk1xPlfLK10JU】
我們仔細(xì)看這字符串,分為三段。分別被 "." 隔開。
我們對(duì):eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9 由 base64 解密得到
{"alg":"HS256","typ":"JWT"} alg 是加密算法名字,typ 是類型
這段: eyJuYW1lIjoxMjMsImlhdCI6MTQ5MTQ3NTQyNCwiZXhwIjoxNDkxNDc1NDg0fQ 由base64解密得到: {"name":123,"iat":1491475424,"exp":1491475484} name 是我們儲(chǔ)存的內(nèi)容,但是多了 iat(創(chuàng)建的時(shí)間戳),exp(到期時(shí)間戳)。
最后一段是hYNC4qFAyhZClmPaLixfN137d41R2CFk1xPlfLK10JU,是由前面?zhèn)z段字符串
HS256 加密后得到。 所以前面的任何一個(gè)字段修改,都會(huì)導(dǎo)致加密后的字符串不匹配。
我們只有在登陸的時(shí)候下發(fā) token,瀏覽器在 cookie 里存儲(chǔ) token 任何人修改,都會(huì)導(dǎo)致服務(wù)器匹配不上。
個(gè)人博客: http://www.liangtongzhuo.com