详解vue项目中使用token的身份验证的简单实践


Posted in Javascript onMarch 08, 2019

工作原理

  • 前端页面进行登录操作, 将用户名与密码发给服务器;
  • 服务器进行效验, 通过后生成token, 包含信息有密钥, uid, 过期时间, 一些随机算法等 ,然后返回给前端
  • 前端将token保存在本地中, 建议使用localstorage进行保存.  下次对服务器发送请求时, 带上本地存储的token
  • 服务器端,进行对token的验证, 通过的话, 进行相应的增删改查操作, 并将数据返回给前端
  • 为通过则返回错误码, 提示保错信息, 然后跳转到登录页.

具体步骤

所用技术: vuex + axios + localStorage + vue-router

1、在登录路由添加自定义mate字段, 来记录该页面是否需要身份验证

//router.js
{
 path: "/index",
 name: "index",
 component: resolve => require(['./index.vue'], resolve),
 meta: { 
  requiresAuth: true 
 }
}

2、设置路由拦截

router.beforeEach((to, from, next) => {
 //matched的数组中包含$route对象的检查元字段
 //arr.some() 表示判断该数组是否有元素符合相应的条件, 返回布尔值
 if (to.matched.some(record => record.meta.requiresAuth)) {
  //判断当前是否有登录的权限
  if (!auth.loggedIn()) {
   next({
    path: '/login',
    query: { redirect: to.fullPath }
   })
  } else {
   next()
  }
 } else {
  next() // 确保一定要调用 next()
 }
})

3、设置拦截器

这里使用axios的拦截器,对所有请求进行拦截判断。

在后面的所有请求中都将携带token进行. 我们利用axios中的拦截器, 通过配置http response inteceptor, 当后端接口返回401 (未授权), 让用户重新执行登录操作。

// http request 拦截器
axios.interceptors.request.use(
 config => {
  if (store.state.token) { // 判断是否存在token,如果存在的话,则每个http header都加上token
   config.headers.Authorization = `token ${store.state.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信息并跳转到登录页面
     store.commit(types.LOGOUT);
     router.replace({
      path: 'login',
      query: {redirect: router.currentRoute.fullPath}
     })
   }
  }
  return Promise.reject(error.response.data) // 返回接口返回的错误信息
});

4、将token存储在本地中

可以使用cookies/local/sessionStograge

三者的区别:

  • sessionStorage 不能跨页面共享的,关闭窗口即被清除,
  • localStorage 可以同域共享,并且是持久化存储的
  • 在 local / session storage 的 tokens,就不能从不同的域名中读取,甚至是子域名也不行.
  • 解决办法使用Cookie.demo: 假设当用户通过 app.yourdomain.com 上面的验证时你生成一个 token 并且作为一个 cookie 保存到 .yourdomain.com,然后,在 youromdain.com 中你可以检查这个 cookie 是不是已经存在了,并且如果存在的话就转到 app.youromdain.com去。这个 token 将会对程序的子域名以及之后通常的流程都有效(直到这个 token 超过有效期)只是利用cookie的特性进行存储而非验证.

关于XSS和XSRF的防范:

  • XSS 攻击的原理是,攻击者插入一段可执行的 JavaScripts 脚本,该脚本会读出用户浏览器的 cookies 并将它传输给攻击者,攻击者得到用户的 Cookies 后,即可冒充用户。
  • 防范 XSS ,在写入 cookies 时,将 HttpOnly 设置为 true,客户端 JavaScripts 就无法读取该 cookies 的值,就可以有效防范 XSS 攻击。
  • CSRF是一种劫持受信任用户向服务器发送非预期请求的攻击方式。
  • 防范 CSRF: 因为 Tokens 也是储存在本地的 session storage 或者是客户端的 cookies 中,也是会受到 XSS 攻击。所以在使用 tokens 的时候,必须要考虑过期机制,不然攻击者就可以永久持有受害用户帐号。

相关文章: XSS 和 CSRF简述及预防措施

//login.vue
 methods: {
  login(){
   if (this.token) {
    //存储在本地的localStograge中
    this.$store.commit(types.LOGIN, this.token)
    //跳转至其他页面
    let redirect = decodeURIComponent(this.$route.query.redirect || '/');
    this.$router.push({
     path: redirect
    })
   }
  }
 }

在vuex中:

import Vuex from 'vuex';
import Vue from 'vue';
import * as types from './types'

Vue.use(Vuex);
export default new Vuex.Store({
 state: {
  user: {},
  token: null,
  title: ''
 },
 mutations: {
  //登录成功将, token保存在localStorage中
  [types.LOGIN]: (state, data) => {
   localStorage.token = data;
   state.token = data;
  },
  //退出登录将, token清空
  [types.LOGOUT]: (state) => {
   localStorage.removeItem('token');
   state.token = null
  }
 }
});

在./types.js中:

export const LOGIN = 'login';
export const LOGOUT = 'logout';

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

Javascript 相关文章推荐
JS日历 推荐
Dec 03 Javascript
幻宇的层模拟窗口效果-提供演示和下载
Jan 20 Javascript
JavaScript 计算当天是本年本月的第几周
Mar 22 Javascript
关于javascript中this关键字(翻译+自我理解)
Oct 20 Javascript
js 判断checkbox是否选中的操作方法
Nov 09 Javascript
利用JQuery和JS实现奇偶行背景颜色自定义效果
Nov 19 Javascript
jquery如何实现在加载完iframe的内容后再进行操作
Sep 10 Javascript
用IE重起计算机或者关机的示例代码
Mar 10 Javascript
Bootstrap Chart组件使用教程
Apr 28 Javascript
vue实现分环境打包步骤(给不同的环境配置相对应的打包命令)
Jun 04 Javascript
详细介绍解决vue和jsp结合的方法
Feb 06 Javascript
用JS写一个发布订阅模式
Nov 07 Javascript
Javascript之高级数组API的使用实例
Mar 08 #Javascript
详解基于vue-cli3快速发布一个fullpage组件
Mar 08 #Javascript
JavaScript实现预览本地上传图片功能完整示例
Mar 08 #Javascript
详解JavaScript 的变量
Mar 08 #Javascript
Angular使用ControlValueAccessor创建自定义表单控件
Mar 08 #Javascript
小程序测试后台服务的方法(ngrok)
Mar 08 #Javascript
详解JavaScript函数callee、call、apply的区别
Mar 08 #Javascript
You might like
php将图片文件转换成二进制输出的方法
2015/06/10 PHP
一个简单安全的PHP验证码类 附调用方法
2016/06/24 PHP
laravel-admin 后台表格筛选设置默认的查询日期方法
2019/10/03 PHP
PHP sdk实现在线打包代码示例
2020/12/09 PHP
麦鸡的TAB切换功能结合了javascript和css
2007/12/17 Javascript
js动态设置鼠标事件示例代码
2013/10/30 Javascript
javascript利用apply和arguments复用方法
2013/11/25 Javascript
详解Vue.js动态绑定class
2016/12/20 Javascript
nodejs进阶(6)—连接MySQL数据库示例
2017/01/07 NodeJs
Vue Element UI + OSS实现上传文件功能
2019/07/31 Javascript
layui 数据表格+分页+搜索+checkbox+缓存选中项数据的方法
2019/09/21 Javascript
[02:50]【扭转乾坤,只此一招】DOTA2全新版本永雾林渊开启新篇章
2020/12/24 DOTA
Python内置函数的用法实例教程
2014/09/08 Python
以Flask为例讲解Python的框架的使用方法
2015/04/29 Python
约瑟夫问题的Python和C++求解方法
2015/08/20 Python
在Python程序和Flask框架中使用SQLAlchemy的教程
2016/06/06 Python
python实现下载整个ftp目录的方法
2017/01/17 Python
详解python中的生成器、迭代器、闭包、装饰器
2019/08/22 Python
Python Matplotlib绘图基础知识代码解析
2020/08/31 Python
如何基于pandas读取csv后合并两个股票
2020/09/25 Python
纯CSS3+DIV实现小三角形边框效果的示例代码
2020/08/03 HTML / CSS
美赞臣新加坡官方旗舰店:Enfagrow新加坡
2019/05/15 全球购物
俄罗斯购买剧院和演唱会门票网站:Parter.ru
2019/11/09 全球购物
英国豪华家具和经典家居饰品购物网站:OKA
2020/06/05 全球购物
什么是.net
2015/08/03 面试题
教师自我评价范例
2013/09/24 职场文书
技术总监岗位职责
2013/12/05 职场文书
乡镇交通安全实施方案
2014/03/29 职场文书
领导班子四风对照检查材料
2014/09/23 职场文书
计划生育诚信协议书
2014/11/02 职场文书
2014年英语工作总结
2014/12/20 职场文书
应届毕业生求职简历自我评价
2015/03/02 职场文书
行政经理岗位职责
2015/04/15 职场文书
大一新生军训新闻稿
2015/07/17 职场文书
春节慰问简报
2015/07/21 职场文书
工程移交协议书
2016/03/24 职场文书