数据模型

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

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. Socket网络编程--初级

    如果想开发一个基于TCP/IP协议的网络程序,应用程序之间则主要通过Socket交换数据 .NET Socket支持四种编程模式 1.居于阻塞模式的Socket编程 2.”非阻塞“模式的Socket编 ...

  2. Mongodb导入本地数据(.dat)到仓库(window)

    借鉴文章,完成了数据文件导入到Mongodb, 尊重作者版权:https://blog.csdn.net/weixin_44198965/article/details/100022616 1.找到你 ...

  3. Java——异常的分类

    2.异常的分类 异常主要分为:错误.一般性异常(受控异常).运行期异常(非受控异常) 错误:Java虚拟机无法解决的严重问题.如:JVM系统内部错误.资源耗尽等严重情况.一般不编写针对性的代码进行处理 ...

  4. JCF——工具类

  5. 二维差分前缀和——cf1202D(好题)

    直接枚举每个点作为左上角是可以做的,但是写起来较麻烦 有一种较为简单的做法是对一列或一行统计贡献 比如某一行的B存在的区间是L,R那么就有三种情况 1.没有这样的区间,即一行都是W,此时这行对答案的贡 ...

  6. DOM学习总结(三)DOM访问/操作

    DOM访问理解:找到这个标签元素,然后才能对它进行操作 1.getElementById() 方法document.getElementById(""); //通过id名字来找到 ...

  7. (转)Linux 多线程编程---pthread_testcancel()等讲解

    1.   所谓线程就是“一个进程内部的一个控制序列”.也就是一个进程内部的并行的基础! 2.    Linux进程可以看成只有一个控制线程:      一个进程在同一时刻只做一件事情.有了多个控制线程 ...

  8. SDNU 1217 CD收藏——并查集

    Description     lmh平常爱听歌,所以买了很多的CD来收藏,但是因为平常整理不当,所以忘记了这些CD的歌手是谁.现在他想知道他到底收藏了多少位歌手的专辑,于是他想了一个办法,同时拿出两 ...

  9. QT--QSocketNotifier类介绍

      QSocketNotifier 用来监听系统文件操作,将操作转换为Qt事件进入系统的消息循环队列.并调用预先设置的事件接受函数,处理事件. 一共存在3类事件:read,write,exceptio ...

  10. mac下nginx

    配置文件位置 /usr/local/etc/nginx/nginx.conf 简单命令 nginx -s quit 退出 nginx -s reload 重新加载 nginx -t 测试nginx.c ...