jwt介绍及使用jwt实现单点登录

  • 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机制

  1. 每个用户经过我们的应用认证之后,我们的应用都要在服务端做一次记录,以方便用户下次请求的鉴别,通常而言session都是保存在内存中,而随着认证用户的增多,服务端的开销会明显增大。
  2. 因为是基于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
      });
    }
  });

});
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值