- jwt : 全称
JSON Web Token
, 官方文档 :JSON Web Token(JWT)是一个开放标准(RFC 7519),它定义了一种紧凑且独立的方式,可以在各方之间作为JSON对象安全地传输信息。此信息可以通过数字签名进行验证和信任。JWT可以使用秘密(使用HMAC算法)或使用RSA或ECDSA的公钥/私钥对进行签名。 - 通俗来讲,JWT是一个含签名并携带用户相关信息的加密串,页面请求校验登录接口时,请求头中携带JWT串到后端服务,后端通过签名加密串匹配校验,保证信息未被篡改。校验通过则认为是可靠的请求,将正常返回数据。
- JWT由 header(头信息),playload(载荷 ),signature(签证信息)组成 , 形如eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ。中间以" . "分割。
传统的session-cookie机制
- 每个用户经过我们的应用认证之后,我们的应用都要在服务端做一次记录,以方便用户下次请求的鉴别,通常而言session都是保存在内存中,而随着认证用户的增多,服务端的开销会明显增大。
- 因为是基于cookie来进行用户识别的, cookie如果被截获,用户就会很容易受到跨站请求伪造的攻击。
下面是使用JWT实现简易登录态的代码
// 在登陆成功时生成加密的token令牌并发送给后端
//第一个参数 : 要加密的内容;
//第二个参数 : 加密方式,这里随便写的
//第三个参数 : 过期时间 ,单位 : 秒
//第四个参数 : 回调函数
jwt.sign({ username : body.username }, 'abcdef',{ expiresIn : 60 } function(err, token) {
res.json({
code : 0,
errmsg : 'ok',
token
});
});
main.js
axios.interceptors.request.use(function (config) {
// 每次发起axios的时候,就会把token带给后端
config.headers.common.token = localStorage.getItem('token');
return config;
}, function (error) {
// 对请求错误做些什么
return Promise.reject(error);
});
前端页面配置
//全局前置守卫,所有的路由都会走到这里
router.beforeEach((to, from, next) => {
//to : 从哪里来的url
//登录界面和注册界面不需要进行token验证
if( to.path == '/login' || to.path == '/register' ){
next();
}
else{
//获取token
var token = localStorage.getItem('token');
if(!token){
//如果不存在,则重定向
next('/login');
}
else{
next();
}
//向后端发送请求,验证token是否合法
axios.get('/api/users/info').then((res)=>{
//res.data.code == 0表示token合法
if(res.data.code == 0){
store.commit('SET_USERNAME',res.data.username);
next();
}
else{
next('/login');
}
}).catch(()=>{
next('/login');
});
}
})
验证token
router.get('/info',(req,res,next)=>{
var token = req.headers.token;
//进行token解码,验证是否是合法的token
jwt.verify(token, 'abcdef', function(err, decoded) {
if(err){
//将结果返回给前端
res.json({
code : -1,
errmsg : 'token错误'
});
}
else{
res.json({
code : 0,
errmsg : 'token正确',
username : decoded.username
});
}
});
});