数据模型

主要用户名,密码,邮箱,头像,身份

const mongoose = require('mongoose')

const schema = new mongoose.Schema({
username: {
type: String,
require: true
},
email: {
type: String,
require: true
},
password: {
type: String,
require: true
},
avator: {
type: String
},
identify:{
type: Number,
require: true
},
createdAt: {
type: String,
default: Date.now()
},
updateAt: {
type: String,
default : Date.now()
}
}) module.exports = mongoose.model('user', schema)

首先注册接口代码

router.post('/register', async ctx => {
const {username, password, email, avatar, identify} = ctx.request.body try {
const user = await UserModel.findOne({email})
if (user) {
return ctx.body = {code: , msg: '邮箱存在'}
}
const newUser = new UserModel({username, password, email, avatar, identify})
const res = await newUser.save() return ctx.body = {code:, data: res }
} catch(err) {
return ctx.body = {code:, msg: '出错啦'}
}
})

首先对密码进行加密加盐

加密方案1

utility进行字符串加密

const utility = require('utility')

exports.md5 = pwd => {
const salt = '!@#$%'
return utility.md5(pwd + salt)
}
const newUser = new UserModel({username, email, avatar, identify, password: md5(password)})

登录接口代码

router.post('/login', async ctx => {
const {email, password} = ctx.request.body const res = await UserModel.findOne({email})
if (!res) return ctx.body = {code: , msg:'用户不存在'} if (res.password !== md5(password)) return ctx.body = {code:, msg: '密码错误'}
const user = {username: res.username, email: res.email, identity: res.identify, avator: res.avatar}
return ctx.body = {code: , data: user} })

安装jwt

jsonwebtoken

返回token

const token = await jwt.sign({username: user.username, id: user._id, email: user.email, timeout: `${(new Date().getTime() + **)}`}, config.secret, {expiresIn: })
return ctx.body = {code: , data: Object.assign(user, {token: `Bearer ${token}`})}

使用koa中间件机制检测用户是否登录或者token是否过期

const jwt = require('jsonwebtoken')
const UserModel = require('../db/models/user')
const config = require('../config/config')
const check = async (ctx, next) => {
const url = ctx.request.url
// 登录,注册不做token校验
if (url === '/user/login' || url === '/user/register') await next()
else {
const token = ctx.request.headers['authorization'].split(' ')[]
// 解析token
const payload = await jwt.verify(token, config.secret)
const date = new Date().getTime()
const {email, timeout} = payload
if (date > parseInt(timeout)) return ctx.body = {code: , msg: 'token过期'}
// 查询用户是否存在
const user = await UserModel.findOne({email: email})
if (!user) return ctx.body = {code: , msg: '用户没有登录'} else await next()
}
} module.exports = check

Vue前端

登录之后获得token存储到本地,并且解析token把用户信息存储到Store中

const user = jwtDecode(token)
window.localStorage.setItem('token', token)
this.setUser(user)
this.setIsAutnenticated(!isEmpty(user))
this.$router.push('/')

路由守卫

根据本地是否有token判断用户是否登录

router.beforeEach((to, from, next) => {
const isLogin = !!window.localStorage.getItem('token')
if (to.path === '/login' || to.path === '/register') next()
else {
isLogin ? next() : next({ name: 'login' })
}
})

请求拦截

把token发生给服务器

axios.interceptors.request.use(config => {
// 添加Loading
startLoading()
const token = window.localStorage.getItem('token')
if (token) {
config.headers['authorization'] = token
}
return config
}, err => {
return err
})

Vue登录登出以及JWT认证的更多相关文章

  1. Vue 登录/登出以及JWT认证

    1. 后端代码概览 server/router/index.js 请求 router.get('/getUserInfo', function (req, res, next) { // 登录请求 r ...

  2. 利用Vue.js实现登录/登出以及JWT认证

    JSON Web Token 入门教程:http://www.ruanyifeng.com/blog/2018/07/json_web_token-tutorial.html 后端代码地址:https ...

  3. flask 实现登录 登出 检查登录状态 的两种方法的总结

    这里我是根据两个项目的实际情况做的总结,方法一(来自项目一)的登录用的是用户名(字符串)和密码,前后端不分离,用form表单传递数据:方法二用的是手机号和密码登录,前后端分离,以json格式传递数据, ...

  4. SpringBoot登录登出切面开发

    阅读本文约“2.5分钟” 本文开发环境是SpringBoot2.X版本. 对于系统而言(这里多指管理系统或部分具备登录登出功能的系统),登录登出是一个类权限验证的过程,现在一般是以token进行校验, ...

  5. Struts2学习第六课 实现登录登出功能

    关于Struts2请求的扩展名问题: 1).org.apache.struts2包下的default.properties中配置了struts2应用的一些常量 2).struts.action.ext ...

  6. ThinkPHP---案例1登录登出和添加部门

    配置文件分3类:系统配置文件,分组配置文件,应用配置文件 ①系统配置文件ThinkPHP/Conf/convention.php: ②分组 / 模块 /平台配置文件Home/Conf/config.p ...

  7. ASP.NET Core 登录登出 - ASP.NET Core 基础教程 - 简单教程,简单编程

    原文:ASP.NET Core 登录登出 - ASP.NET Core 基础教程 - 简单教程,简单编程 ASP.NET Core 登录登出 上一章节我们总算完善了注册的功能,而且也添加了一个用户,现 ...

  8. Django项目: 4.用户登录登出功能

    用户登录登出功能 一.功能需求分析 1. 登录退出功能分析 流程图 功能 登录页面 登录功能 退出功能 二.登录页面 1. 接口设计 接口说明 类目 说明 请求方法 GET url定义 /user/l ...

  9. jquery ajax常用的登录登出

    整理jquery+ajax的登录登出方法. //登录 var currentUserId = -1; $(function() { var timestamp = (new Date()).value ...

随机推荐

  1. 第二章 部署Kubernetes集群准备环境

    一.centos7开机自动联网设置 1.使用root用户登录进入Linux,打开进去终端 2.在终端中输入:cd  /etc/sysconfig/network-scripts 3.ll命令找到目录下 ...

  2. Galaxy

    Galaxy 在一维坐标轴上给出n个点,第i个点坐标为\(x_i\),现在你可以任意移动k个点的,最小化它们的方差,\(n\leq 50000\). 解 感觉以前写的太乱了,补一篇可以供快速阅读的题解 ...

  3. Nginx---系统学习

    **********************************************前言************************************ =============== ...

  4. PowerPoint for Mac 中的键盘快捷方式汇总

    PowerPoint for Mac 中的键盘快捷方式介绍给大家,使用PowerPoint for Mac可以创建新颖别致的演示文稿通过漂亮的设计.丰富的动画.电影动作.3D 模型和图标传达你的想法. ...

  5. kNN算法和决策树

    的整数. 下面看书上给出的实例: from numpy import * import operator def createdataset(): group=array([[1.0,1.1],[1. ...

  6. Vue学习笔记【6】——事件修饰符

    .stop 阻止冒泡(阻止事件向外层冒泡) .prevent 阻止默认事件(链接跳转.表单提交) .capture 添加事件侦听器时使用事件捕获模式(从外到里触发事件) .self 只当事件在该元素本 ...

  7. 分布式项目web.xml配置文件的表头

    <?xml version="1.0" encoding="UTF-8"?><web-app xmlns:xsi="http://w ...

  8. security安全框架 配置

    <?xml version="1.0" encoding="UTF-8"?><beans:beans xmlns="http://w ...

  9. Java桌球小游戏

    版本一.出现窗口package cn.xjion.game;/** * 出现窗口 * @author xjion * */import java.awt.*;import javax.swing.*; ...

  10. Dijkstra Algorithm 迪克特斯拉算法--Python

    迪克斯拉特算法: 1.找出代价最小的节点,即可在最短时间内到达的节点: 2.更新节点的邻居的开销: 3.重复这个过程,直到图中的每个节点都这样做了: 4.计算最终路径. ''' 迪克斯特拉算法: 1. ...