数据模型

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

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. ElasticSearch中分词器组件配置详解

    首先要明确一点,ElasticSearch是基于Lucene的,它的很多基础性组件,都是由Apache Lucene提供的,而es则提供了更高层次的封装以及分布式方面的增强与扩展. 所以要想熟练的掌握 ...

  2. Git分布式版本控制系统(上)

    Git分布式版本控制系统(上) 链接:https://pan.baidu.com/s/1CgaEv12cwfbs5RxcNpxdAg 提取码:fytm 复制这段内容后打开百度网盘手机App,操作更方便 ...

  3. Codeforces 346D Robot Control DP spfa 01BFS

    题意及思路:https://www.cnblogs.com/zjp-shadow/p/9562888.html 这题由于性质特殊,可以用01BFS来进行DP的转移. 代码: #include < ...

  4. springBoot框架在idea中创建流程 同时存在一个项目中

    1.新建普通maven工程 2.在父级pom中按需修改 3.删除父级src目录 4.创建公共模块common,里面只有service接口和实体类 5.构建微服务模块,provider 6.引用Zook ...

  5. HTML5 原生API input file 来实现多图上传,并大图预览

    闲来无事,突然想用原生来实现图片的多图上传. 一.效果图大致如下: 1.上传时可以选择多图 2.上传之后缩略图下过图如下: 3.点击缩略图,大图展示当前所点击的图片,并可以左右滑动查看其它的缩略图对应 ...

  6. CSS3 object-position/object-fit

    object-position和object-fit只针对替换元素有作用,也就是form表单家族控件系列,老牌劲旅img图片,HTML5新贵video视频等元素(一般有src属性的). 一.objec ...

  7. Java分支结构

    Java 分支结构 - if...else/switch 顺序结构只能顺序执行,不能进行判断和选择,因此需要分支结构. Java有两种分支结构: if语句 switch语句 if语句 一个if语句包含 ...

  8. vscode开发vue项目保存时自动执行lint进行修复

    vscode下载eslint插件 vscode进行设置 找到settings.json 在里面写入如下内容进行保存 {     "eslint.autoFixOnSave": tr ...

  9. mockjs 使用以及反向校验

    一.背景 前端开发需要依赖后端接口 后端接口输出慢.接口规范随时可能会变,而前端毫无感知 前端需要自己 mock 假数据 json 文件 假数据 json 数据内容是静态的,测试不同返回情况需要修改 ...

  10. php linux下安装xml扩展

    1.进入PHP安装源码包,找到ext下的ftp,进入 cd /home/local/php-5.6.25/ext/xml 2./usr/local/php/bin/phpize 3../configu ...