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 相关文章推荐
Javascript - HTML的request类
Jul 15 Javascript
Chrome中模态对话框showModalDialog返回值问题的解决方法
May 25 Javascript
对于Form表单reset方法的新认识
Mar 05 Javascript
ExtJS4 表格的嵌套 rowExpander应用
May 02 Javascript
jQuery.holdReady()使用方法
May 20 Javascript
javascript中with()方法的语法格式及使用
Aug 04 Javascript
一个不错的js html页面倒计时可精确到秒
Oct 22 Javascript
原生js和jQuery随意改变div属性style的名称和值
Oct 22 Javascript
jQuery实现图片预加载效果
Nov 27 Javascript
微信小程序通过js实现瀑布流布局详解
Aug 28 Javascript
微信小程序实现图片翻转效果的实例代码
Sep 20 Javascript
Vue.js下拉菜单组件使用方法详解
Oct 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开发者的10个技巧
2011/02/25 PHP
Yii视图CGridView实现操作按钮定义地址示例
2016/07/14 PHP
PHP页面输出时js设置input框的选中值
2016/09/30 PHP
PHP递归算法的简单实例
2019/02/28 PHP
stream.js 一个很小、完全独立的Javascript类库
2011/10/28 Javascript
parentElement,srcElement的使用小结
2014/01/13 Javascript
js判断页面中是否有指定控件的简单实例
2014/03/04 Javascript
javascript基于HTML5 canvas制作画箭头组件
2014/06/25 Javascript
jQuery拖拽插件gridster使用指南
2015/04/21 Javascript
纯js实现无限空间大小的本地存储
2015/06/18 Javascript
jQuery实现淡入淡出二级下拉导航菜单的方法
2015/08/28 Javascript
基于javascript显示当前时间以及倒计时功能
2016/03/18 Javascript
jQuery实现图片加载完成后改变图片大小的方法
2016/03/29 Javascript
ECMAScript6轮播图实践知识总结
2016/08/17 Javascript
基于jQuery的checkbox全选问题分析
2016/11/18 Javascript
Node.js查找当前目录下文件夹实例代码
2017/03/07 Javascript
JavaScript实现三级联动菜单效果
2017/08/16 Javascript
JavaScript作用域链实例详解
2019/01/21 Javascript
[00:56]2014DOTA2国际邀请赛 DK、iG 赛前探访
2014/07/10 DOTA
[00:58]他们到底在电话里听到了什么?
2017/11/21 DOTA
使用python搭建Django应用程序步骤及版本冲突问题解决
2013/11/19 Python
Python中条件判断语句的简单使用方法
2015/08/21 Python
Python2/3中urllib库的一些常见用法
2017/12/19 Python
分享一下Python数据分析常用的8款工具
2018/04/29 Python
Python读写docx文件的方法
2018/05/08 Python
详解Django的model查询操作与查询性能优化
2018/10/16 Python
python GUI实现小球满屏乱跑效果
2019/05/09 Python
tensorflow:指定gpu 限制使用量百分比,设置最小使用量的实现
2020/02/06 Python
canvas 实现 github404动态效果的示例代码
2017/11/15 HTML / CSS
欧洲、亚洲、非洲和拉丁美洲的度假套餐:Great Value Vacations
2019/03/30 全球购物
临床医师专业个人自我评价
2014/01/08 职场文书
2014年超市工作总结
2014/11/19 职场文书
放弃遗产继承公证书
2015/01/26 职场文书
中学团支部工作总结
2015/08/13 职场文书
2016大学迎新欢迎词
2015/09/29 职场文书
python实战之一步一步教你绘制小猪佩奇
2021/04/22 Python