vue+egg+jwt实现登录验证的示例代码


Posted in Javascript onMay 18, 2019

原理:vue前端登录,提交账号密码给egg后端,后端比对信息后,使用jsonwebtoken对用户信息进行签名生成token,之后通过cookie返回给vue前端,前端需要使用token里的信息就使用js-base64进行token第二段解码即可。

vue前端路由跳转,进入路由前置守卫检测cookie中的token是否存在,不存在(已过期)则跳转登录,否则继续执行,然后在http拦截器里请求时存在token请求头带上token,后端未得到header则返回错误码,得到则用jsonwebtoken进行验证,是时间错误就从新发放token令牌,否则返回错误码,还要及时更新cookie时间,保证登录态.

vue前端main.js中:

import axios from 'axios';
import cookie from './public/util';
router.beforeEach((to, from, next) => {
 console.log('路由拦截')
 //判断要去的路由有没有requiresAuth
 if (to.meta.requiresAuth) {
  let token = cookie.getCookie('token');
  if (token) {
   next();
  } else {
   next({
    path: '/login'
   });
  }
 } else {
  next(); //如果无需token,那么随它去吧
 }
})
// http request 拦截器
axios.interceptors.request.use(
 config => {
  let token = cookie.getCookie('token');
  console.log(token)
  if (token) { // 判断是否存在token,如果存在的话,则每个http header都加上token
   config.headers.authorization = `token ${token}`;
  }
  return config;
 },
 err => {
  return Promise.reject(err);
 });
 
// http response 拦截器
axios.interceptors.response.use(
 response => {
  return response;
 },
 error => {
  if (error.response) {
   switch (error.response.status) {
    case 401:
     // 返回 401 清除token信息并跳转到登录页面
     router.replace({
      path: '/login'
     });
   }
  }
  return Promise.reject(error.response.data);  // 返回接口返回的错误信息
 });
Vue.prototype.$http = axios;

其中util.js中我封装了操作cookie的方法

//获取cookie、
function getCookie(name) {
  var arr, reg = new RegExp("(^| )" + name + "=([^;]*)(;|$)");
  if (arr = document.cookie.match(reg))
   return (arr[2]);
  else
   return null;
  }
  
  //设置cookie,增加到vue实例方便全局调用
function setCookie (c_name, value, expiredays) {
  var exdate = new Date();
  exdate.setDate(exdate.getDate() + expiredays);
  document.cookie = c_name + "=" + escape(value) + ((expiredays == null) ? "" : ";expires=" + exdate.toGMTString());
  };
  
  //删除cookie
function delCookie (name) {
  var exp = new Date();
  exp.setTime(exp.getTime() - 1);
  var cval = getCookie(name);
  if (cval != null)
   document.cookie = name + "=" + cval + ";expires=" + exp.toGMTString();
  };
  module.exports = {
  getCookie:getCookie,
  setCookie:setCookie,
  delCookie:delCookie
  }

路由中需要登录才能访问的页面,应:

path:'/admin/manager',component:Page,name:'管理系统首页',meta:{requiresAuth:true}

如果需要获取token中的信息则:

let token = cookie.getCookie('token');
let Base64 = require('js-base64').Base64;
let str = token.split('.')[1];
let user = JSON.parse(Base64.decode(str));
console.log(user)

后端在登录逻辑执行完后,需要给前端发放token

let jwt = require('jsonwebtoken');
    let token = jwt.sign({
      user_id:1,
      user_name: '张三'
     }, '自定义签名盐值', {
      expiresIn: '60s' //时间根据自己定,具体可参考jsonwebtoken插件官方说明
     });
this.ctx.cookies.set('token', token, {maxAge:60*1000,httpOnly:false,overwrite:true,signed:false})
this.ctx.body = true;

接着是中间件:

module.exports = () => {
 const jwt = require('jsonwebtoken');
 return async function (ctx, next) {
  if (ctx.request.header['authorization']) {
   let token = ctx.request.header['authorization'].split(' ')[1];
   console.log(token)
   let decoded;
   //解码token
   try {
    decoded = jwt.verify(token, '加签时定义的盐值');
   } catch (error) {
    if (error.name == 'TokenExpiredError') {
     console.log('时间到期')
     //重新发放令牌
     token = jwt.sign({
      user_id: 1,
      user_name: '张三'
     }, 'sinner77', {
      expiresIn: '60s' //过期时间设置为60妙。那么decode这个token的时候得到的过期时间为 : 创建token的时间 + 设置的值
     });
     ctx.cookies.set('token', token, {
      maxAge: 60 * 1000,
      httpOnly: false,
      overwrite: true,
      signed: false
     });
    } else {
     ctx.status = 401;
     ctx.body = {
      message: 'token失效'
     }
     return;
    }
   }
   //重置cookie时间
   ctx.cookies.set('token', token, {
    maxAge: 60 * 1000,
    httpOnly: false,
    overwrite: true,
    signed: false
   });
   await next();
  } else {
   ctx.status = 401;
   ctx.body = {
    message: '没有token'
   }
   return;
  }
 }
};

最后在需要登录才可访问的资源路由上使用该中间件,如:

const checktoken = app.middleware.checktoken();
 router.get('/test',checktoken,controller.util.test);

至此,以cookie维护登录态,token做登录权限验证就完成了

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
页面中js执行顺序
Nov 09 Javascript
页面回到顶部的三种实现(锚标记,js)
Oct 01 Javascript
jQuery 插件仿百度搜索框智能提示(带Value值)
Jan 22 Javascript
js Object2String方便查看js对象内容
Nov 24 Javascript
jQuery实现tab标签自动切换的方法
Feb 28 Javascript
JavaScript实现图片瀑布流和底部刷新
Jan 02 Javascript
js选项卡的制作方法
Jan 23 Javascript
jQuery基于ajax方式实现用户名存在性检查功能示例
Feb 10 Javascript
node的process以及child_process模块学习笔记
Mar 06 Javascript
微信小程序倒计时功能实例代码
Jul 17 Javascript
vue2 中二级路由高亮问题及配置方法
Jun 10 Javascript
react 原生实现头像滚动播放的示例
Apr 21 Javascript
egg.js的基本使用和调用数据库的方法示例
May 18 #Javascript
inquirer.js一个用户与命令行交互的工具详解
May 18 #Javascript
webpack 代码分离优化快速指北
May 18 #Javascript
如何实现小程序tab栏下划线动画效果
May 18 #Javascript
微信小程序结合Storage实现搜索历史效果
May 18 #Javascript
Fetch超时设置与终止请求详解
May 18 #Javascript
微信小程序实现搜索历史功能
Mar 26 #Javascript
You might like
php面向对象全攻略 (十七) 自动加载类
2009/09/30 PHP
php读取excel文件示例分享(更新修改excel)
2014/02/27 PHP
php使用GD库创建图片缩略图的方法
2015/06/10 PHP
用CSS+JS实现的进度条效果效果
2007/06/05 Javascript
JQuery 控制内容长度超出规定长度显示省略号
2014/05/23 Javascript
原生JS绑定滑轮滚动事件兼容常见浏览器
2014/06/30 Javascript
Jquery实现弹性滑块滑动选择数值插件
2015/08/08 Javascript
关于JS变量和作用域详解
2016/07/28 Javascript
JS实现简单拖拽效果
2017/06/21 Javascript
Vue和Bootstrap的整合思路详解
2017/06/30 Javascript
JS+CSS实现滚动数字时钟效果
2017/12/25 Javascript
Vue微信项目按需授权登录策略实践思路详解
2018/05/07 Javascript
CKEditor4配置与开发详细中文说明文档
2018/10/08 Javascript
vue开发环境配置跨域的方法步骤
2019/01/16 Javascript
在vue中使用axios实现post方式获取二进制流下载文件(实例代码)
2019/12/16 Javascript
基于JavaScript实现简单抽奖功能代码实例
2020/10/20 Javascript
[26:40]DOTA2上海特级锦标赛A组资格赛#1 Secret VS MVP.Phx第一局
2016/02/25 DOTA
[01:06]欢迎来到上海,TI9
2018/08/26 DOTA
python简单分割文件的方法
2015/07/30 Python
Python实现最常见加密方式详解
2019/07/13 Python
python飞机大战pygame碰撞检测实现方法分析
2019/12/17 Python
Python中sorted()排序与字母大小写的问题
2020/01/14 Python
Python无头爬虫下载文件的实现
2020/04/02 Python
Python tkinter制作单机五子棋游戏
2020/09/14 Python
用sleep间隔进行python反爬虫的实例讲解
2020/11/30 Python
Pycharm 设置默认解释器路径和编码格式的操作
2021/02/05 Python
诗普兰迪官方网站:Splendid
2018/09/18 全球购物
Notino瑞典:购买香水和美容产品
2019/07/26 全球购物
什么是Smarty变量操作符?如何使用Smarty变量操作符
2014/07/18 面试题
室内设计专业学生的自我评价分享
2013/11/27 职场文书
《大禹治水》教学反思
2014/04/27 职场文书
税务职业生涯规划书范文
2014/09/16 职场文书
旅游局领导班子“四风”问题对照检查材料思想汇报
2014/09/29 职场文书
表扬通报怎么写
2015/01/16 职场文书
意向协议书
2015/01/27 职场文书
AJAX引擎原理以及XmlHttpRequest对象的axios、fetch区别详解
2022/04/09 Javascript