jsonwebtoken:加密方法
概念:
先在后端生成token,再发送到前端接收,前端存储到本地,前端验证的时候发送给后端
1.后端生成token和验证token
exports.sign = (username) => {//添加token加用私钥
const privateKey = fs.readFileSync(path.join(__dirname, '../keys/rsa_private_key.pem'))
const token = jwt.sign({username}, privateKey, { algorithm: 'RS256' })//加密谁,私钥,加密类型
return token
}
exports.verify = (token) => {//验证用公钥
const publicKey = fs.readFileSync(path.join(__dirname, '../keys/rsa_public_key.pem'))
const result = jwt.verify(token, publicKey)
return result
}
2.用户登录后后端将token放在返回头发送给前端
const token = sign(username)//调用tools文件生成token
res.set('X-Access-Token', token)//放在返回头首部字段,
res.render('succ', {
data: JSON.stringify({
username
})
})
3.前端接收到token并且保存到本地
$.ajax({
url: '/api/users/signin',
type: 'post',
dataType: 'json',
data,
success: function(res, textStatus, jqXHR) {//后端来的token
const token = jqXHR.getResponseHeader('X-Access-Token')
//从头部找token
localStorage.setItem('lg-token', token)
//token存在本地
if(res.ret) {//如果正确
console.log(res);
router.go('/index')
}
}
})
4.前端在每次进入页面时,先将本地token发送给后端
$.ajax({
url: '/api/users/isAuth',
dataType: 'json',
headers: {
'X-Access-Token': localStorage.getItem('lg-token') || ''
//放在头部往后端发数据
},
success(result) {
if(result.ret) {
router.go('/index')
} else {
router.go('/signin')
}
}
})
5.后端验证前端传来的token
const isAuth = async (req, res, next) => {
let token = req.get('X-Access-Token')//获取前端发来的请求头的token
try {
let result = verify(token)//调用tools里的verify验证token是否正确
res.render('succ', {//token正确,给前端用户名
data: JSON.stringify({
username: result.username
})
})
} catch(e) {
res.render('fail', {
data: JSON.stringify({
message: '请登录。'
})
})
}
}
-------------------------------其他-----------------------------------------
网址:jwt.io
1.对称加密HS256
拿到jwt,去加密,(携带的参数是啥,秘钥)
i love you是秘钥
2.不对称加密Rs256
先生成私钥,再生成公钥,
创建:
验证时公钥,发送时私钥
使用: