Vue登录登出以及JWT认证
数据模型
主要用户名,密码,邮箱,头像,身份
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认证的更多相关文章
- Vue 登录/登出以及JWT认证
1. 后端代码概览 server/router/index.js 请求 router.get('/getUserInfo', function (req, res, next) { // 登录请求 r ...
- 利用Vue.js实现登录/登出以及JWT认证
JSON Web Token 入门教程:http://www.ruanyifeng.com/blog/2018/07/json_web_token-tutorial.html 后端代码地址:https ...
- flask 实现登录 登出 检查登录状态 的两种方法的总结
这里我是根据两个项目的实际情况做的总结,方法一(来自项目一)的登录用的是用户名(字符串)和密码,前后端不分离,用form表单传递数据:方法二用的是手机号和密码登录,前后端分离,以json格式传递数据, ...
- SpringBoot登录登出切面开发
阅读本文约“2.5分钟” 本文开发环境是SpringBoot2.X版本. 对于系统而言(这里多指管理系统或部分具备登录登出功能的系统),登录登出是一个类权限验证的过程,现在一般是以token进行校验, ...
- Struts2学习第六课 实现登录登出功能
关于Struts2请求的扩展名问题: 1).org.apache.struts2包下的default.properties中配置了struts2应用的一些常量 2).struts.action.ext ...
- ThinkPHP---案例1登录登出和添加部门
配置文件分3类:系统配置文件,分组配置文件,应用配置文件 ①系统配置文件ThinkPHP/Conf/convention.php: ②分组 / 模块 /平台配置文件Home/Conf/config.p ...
- ASP.NET Core 登录登出 - ASP.NET Core 基础教程 - 简单教程,简单编程
原文:ASP.NET Core 登录登出 - ASP.NET Core 基础教程 - 简单教程,简单编程 ASP.NET Core 登录登出 上一章节我们总算完善了注册的功能,而且也添加了一个用户,现 ...
- Django项目: 4.用户登录登出功能
用户登录登出功能 一.功能需求分析 1. 登录退出功能分析 流程图 功能 登录页面 登录功能 退出功能 二.登录页面 1. 接口设计 接口说明 类目 说明 请求方法 GET url定义 /user/l ...
- jquery ajax常用的登录登出
整理jquery+ajax的登录登出方法. //登录 var currentUserId = -1; $(function() { var timestamp = (new Date()).value ...
随机推荐
- Socket网络编程--初级
如果想开发一个基于TCP/IP协议的网络程序,应用程序之间则主要通过Socket交换数据 .NET Socket支持四种编程模式 1.居于阻塞模式的Socket编程 2.”非阻塞“模式的Socket编 ...
- Mongodb导入本地数据(.dat)到仓库(window)
借鉴文章,完成了数据文件导入到Mongodb, 尊重作者版权:https://blog.csdn.net/weixin_44198965/article/details/100022616 1.找到你 ...
- Java——异常的分类
2.异常的分类 异常主要分为:错误.一般性异常(受控异常).运行期异常(非受控异常) 错误:Java虚拟机无法解决的严重问题.如:JVM系统内部错误.资源耗尽等严重情况.一般不编写针对性的代码进行处理 ...
- JCF——工具类
- 二维差分前缀和——cf1202D(好题)
直接枚举每个点作为左上角是可以做的,但是写起来较麻烦 有一种较为简单的做法是对一列或一行统计贡献 比如某一行的B存在的区间是L,R那么就有三种情况 1.没有这样的区间,即一行都是W,此时这行对答案的贡 ...
- DOM学习总结(三)DOM访问/操作
DOM访问理解:找到这个标签元素,然后才能对它进行操作 1.getElementById() 方法document.getElementById(""); //通过id名字来找到 ...
- (转)Linux 多线程编程---pthread_testcancel()等讲解
1. 所谓线程就是“一个进程内部的一个控制序列”.也就是一个进程内部的并行的基础! 2. Linux进程可以看成只有一个控制线程: 一个进程在同一时刻只做一件事情.有了多个控制线程 ...
- SDNU 1217 CD收藏——并查集
Description lmh平常爱听歌,所以买了很多的CD来收藏,但是因为平常整理不当,所以忘记了这些CD的歌手是谁.现在他想知道他到底收藏了多少位歌手的专辑,于是他想了一个办法,同时拿出两 ...
- QT--QSocketNotifier类介绍
QSocketNotifier 用来监听系统文件操作,将操作转换为Qt事件进入系统的消息循环队列.并调用预先设置的事件接受函数,处理事件. 一共存在3类事件:read,write,exceptio ...
- mac下nginx
配置文件位置 /usr/local/etc/nginx/nginx.conf 简单命令 nginx -s quit 退出 nginx -s reload 重新加载 nginx -t 测试nginx.c ...