vue+express+jwt持久化登录的方法


Posted in Javascript onJune 14, 2019

jwt 持久化验证前端篇,node 配置详情请移步这里

我用的是vue3,下面是 src 的目录

vue+express+jwt持久化登录的方法

用到的依赖

vue+express+jwt持久化登录的方法

验证思路

Home 页写登录,然后在 About 页获取到登录名。
登录成功缓存 token,进入About页时,通过判断是否有 token 来判断是否登录/登录超时

登录页

在登录页输入用户名和密码,将其提交到vuex

// src/views/Home.vue

<template>
 <div class="home">
  <input type="text" v-model="user" placeholder="账号">
  <input type="text" v-model="password" placeholder="密码">
  <button @click="login">点击</button>
 </div>
</template>

<script>
import {mapActions} from 'vuex'
export default {
 data(){
  return{
   user:'',
   password:''
  }
 },
 name: 'home',
 methods:{
  ...mapActions(["toLogin"]),
  login(){
   // 请求之后能拿到用户名,nickname,把用户名存在state
   // 传入多个参数 改成对象
   // action moutation只能拿第一个参数哦,所以要改成对象
   this.toLogin({user:this.user,password:this.password})
  }
 }
}
</script>

后台 jwt

后台的 jwt 验证,我们把过期时间设置成60s

// src/app.js

let express = require('express')
let cors = require('cors')
let bodyParser = require('body-parser')
let jwt = require("jsonwebtoken")

let app = express()

app.use(cors())
app.use(bodyParser.json())
app.use(bodyParser.urlencoded({extended:false}))

// 模拟一个登陆的接口
app.post('/login',function(req,res){
  // 登录成功获取用户名
  let username = req.body.user
  res.json({
    // 进行加密的方法
    // sing 参数一:加密的对象 参数二:加密的规则 参数三:对象
    token:jwt.sign({username:username},'abcd',{
      // 过期时间
      expiresIn:"60s"
    }),
    username,
    code:200
  })
})

// 登录持久化验证接口 访问这个接口的时候 一定要访问token(前端页面每切换一次,就访问一下这个接口,问一下我有没有登录/登陆过期)
// 先访问登录接口,得到token,在访问这个,看是否成功
app.post('/validate',function(req,res){
  let token = req.headers.authorization;
  // 验证token合法性 对token进行解码
  jwt.verify(token,'abcd',function(err,decode){
    if(err){
      res.json({
        msg:'当前用户未登录'
      })
    }else {
      // 证明用户已经登录
      res.json({
        token:jwt.sign({username:decode.username},'abcd',{
          // 过期时间
          expiresIn:"60s"
        }),
        username:decode.username,
        msg:'已登录'
      })
    }
  })
})

app.listen(8000,function(){
  console.log('OK')
})

后台接口

// src/api/login.js

import axios from 'axios'
axios.defaults.baseURL = 'http://localhost:8000'

// axios 请求拦截
axios.interceptors.request.use(function(response){
  // 在 headers 中设置authorization 属性放token,token是存在缓存中的
  response.headers.authorization = localStorage["token"]
  return response
}, function (error) {
  return Promise.reject(error);
 })
// axios 响应拦截器
axios.interceptors.response.use(function (response) {
  return response.data;
 }, function (error) {
  return Promise.reject(error);
 });

// 登录的接口
export let loginApi = (user,password) => {
  return axios.post('/login',{user,password})
}

// 验证是否登录的接口
export let valiApi = () => {
  return axios.post('/validate')
}

vuex

// src/store.js

import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)

import {loginApi,valiApi} from './api/login'

export default new Vuex.Store({
 state: {
  username:""
 },
 mutations: {
  setusername(state,payload){
   // 改变state里的 username
   state.username = payload
  }
 },
 actions: {
  async toLogin({commit},{user,password}){
   let res = await loginApi(user,password)
   console.log(res)
   let {username,token} = res
   // 提交到 mutations
   commit("setusername",username)
   // token 具有时效性 登录成功 把token存在本地存储
   localStorage["token"] = token
  },
  async valiApi({commit}){
   const { username, token } = await valiApi();
   commit('setusername', username);
   localStorage["token"] = token
   return username !== undefined;
  }
 }
})

验证持久化登录页

从 vuex 中拿到用户名,打开页面就请求是否登录的 api ,从而实现持久化登录验证

// src/views/About.vue

<template>
 <div class="about">
  昵称:{{nickname}}
 </div>
</template>

<script>
import {mapState} from "vuex"
import {valiApi} from '../api/login'
export default {
 data(){
  return{
   nickname:''
  }
 },
 computed:{
  ...mapState(["username"])
 },
 // 打开这个页面 就请求 valiApi 查看用户是否登录
 async created(){
  let res = await valiApi();
  console.log(res)
  this.nickname = res.username
  if(res.username !== undefined){
   alert("welcome " + res.username)
  } else {
   alert("请登录")
  }
 }
}
</script>

操作 验证是否成功

运行 node

vue+express+jwt持久化登录的方法

登录

点击登录按钮,登录成功,成功获取到用户名和token

vue+express+jwt持久化登录的方法

验证

由于我们设置的过期时间是60s,所以要在60s内点击About页查看

vue+express+jwt持久化登录的方法

60s后(过期后)

vue+express+jwt持久化登录的方法

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

Javascript 相关文章推荐
js下将字符串当函数执行的方法
Jul 13 Javascript
Node.js本地文件操作之文件拷贝与目录遍历的方法
Feb 16 Javascript
微信小程序  audio音频播放详解及实例
Nov 02 Javascript
利用n 升级工具升级Node.js版本及在mac环境下的坑
Feb 15 Javascript
JS+Canvas绘制动态时钟效果
Nov 10 Javascript
深入理解ES6中let和闭包
Feb 22 Javascript
JS中promise化微信小程序api
Apr 12 Javascript
vue实现动态添加数据滚动条自动滚动到底部的示例代码
Jul 06 Javascript
vue项目在安卓低版本机显示空白的原因分析(两种)
Sep 04 Javascript
JavaScript禁用右键单击优缺点分析
Jan 20 Javascript
vue项目中使用scss的方法步骤
May 16 Javascript
layui默认选中table的CheckBox复选框方法
Sep 19 Javascript
深入剖析JavaScript instanceof 运算符
Jun 14 #Javascript
ES6 Promise对象的含义和基本用法分析
Jun 14 #Javascript
ES6顶层对象、global对象实例分析
Jun 14 #Javascript
ES6数组与对象的解构赋值详解
Jun 14 #Javascript
简单了解Ajax表单序列化的实现方法
Jun 14 #Javascript
通过JS深度判断两个对象字段相同
Jun 14 #Javascript
CKEditor 4.4.1 添加代码高亮显示插件功能教程【使用官方推荐Code Snippet插件】
Jun 14 #Javascript
You might like
使用PHP批量生成随机用户名
2008/07/10 PHP
php Rename 更改文件、文件夹名称
2011/05/24 PHP
PHP数组式访问接口ArrayAccess用法分析
2017/12/28 PHP
使用PHPExcel导出Excel表
2018/09/08 PHP
ext实现完整的登录代码
2008/08/08 Javascript
JQuery设置和去除disabled属性的5种方法总结
2013/05/16 Javascript
js操作输入框提示信息且响应鼠标事件
2014/03/25 Javascript
jQuery UI设置固定日期选择特效代码分享
2015/08/27 Javascript
纯JavaScript基于notie.js插件实现消息提示特效
2016/01/18 Javascript
第一章之初识Bootstrap
2016/04/25 Javascript
整理JavaScript对DOM中各种类型的元素的常用操作
2016/05/05 Javascript
值得分享的轻量级Bootstrap Table表格插件
2016/05/30 Javascript
jQuery插件HighCharts实现2D柱状图、折线图的组合多轴图效果示例【附demo源码下载】
2017/03/09 Javascript
js如何编写简单的ajax方法库
2017/08/02 Javascript
nodeJS模块简单用法示例
2018/04/21 NodeJs
浅谈如何通过node.js对数据进行MD5加密
2018/05/16 Javascript
Element-ui tree组件自定义节点使用方法代码详解
2018/09/17 Javascript
15分钟学会vue项目改造成SSR(小白教程)
2019/12/17 Javascript
el-form 多层级表单的实现示例
2020/09/10 Javascript
python3使用urllib示例取googletranslate(谷歌翻译)
2014/01/23 Python
Python入门篇之对象类型
2014/10/17 Python
pymongo给mongodb创建索引的简单实现方法
2015/05/06 Python
django 2.2和mysql使用的常见问题
2019/07/18 Python
修改 CentOS 6.x 上默认Python的方法
2019/09/06 Python
Tensorflow累加的实现案例
2020/02/05 Python
python入门之井字棋小游戏
2020/03/05 Python
python+flask编写一个简单的登录接口
2020/11/13 Python
Python系统公网私网流量监控实现流程
2020/11/23 Python
基于CSS3实现图片模糊过滤效果
2015/11/19 HTML / CSS
火山动力Java笔试题
2014/06/26 面试题
六十大寿答谢词
2014/01/12 职场文书
文秘大学生求职信
2014/02/25 职场文书
2014基层党员干部学习全国两会心得体会
2014/03/17 职场文书
法律讲堂观后感
2015/06/11 职场文书
迎客户欢迎词三篇
2019/09/27 职场文书
如何用 Python 子进程关闭 Excel 自动化中的弹窗
2021/05/07 Python