最近在app的开发过程中,做了一个基于token的用户登录认证,使用vue+node+mongoDB进行的开发,前来总结一下。

token认证流程:

1:用户输入用户名和密码,进行登录操作,发送登录信息到服务器端。

2:服务器端查询数据库验证用户名密码是否正确,正确,通过jsonwebtoken生成token,返回给客户端;否则返回错误信息给客户端。

3:通过本地存储存储获取的token信息,并且会跳转到路由指定的页面。

4:当客户端需要请求数据时,发送请求,并且在请求的头文件中添加本地存储的token信息。

5:服务器端获取到请求头文件中的token信息,解析token信息,验证是否有效,有效,查询数据库,返回请求的数据。

客户端与服务器端关于token的验证示意图:

1:用户登录的模型骨架文件user.js

'use strict';let mongoose = require('mongoose'),Schema = mongoose.Schema;let userSchema = new Schema({"username": String,"password": String,"token": String,"create_time": Date});let users = mongoose.model('users', userSchema);module.exports = users;

2:服务器端api请求文件api.js

const express = require('express');
const router = express();
const db=require('../db/db.js');
const User=require('../db/user.js');
const Login=require('../db/login.js');
const Fan=require('../db/fan.js');
const Power=require('../db/power.js');
const createToken = require('../token/createToken');
const checkToken = require('../token/checkToken');// 注册
router.post('/add', function(req, res, next){let username = req.body.username,password = req.body.password;let newUser = new User({username: req.body.username,password: req.body.password});User.findOne({"username":username},(err, result) => {if(err){console.log('error:' + err);return;}console.log('result:',result);if(!result){newUser.save(function(err, result){if(err){console.log('error:' + err);return;}res.send({success: true, msg: '注册成功'});});}else{res.send({success: false, msg: '用户名已经存在'});}});
});// 登录
router.post('/login', function(req, res, next){let username = req.body.username,password = req.body.password;User.findOne({"username":username},(err, result) => {if(err){res.send({success: false, msg: '用户名不存在'})console.log('error:' + err);return;}console.log('result:',result)if(result.password === password){console.log('登录成功')               // 调用token生成函数let _token = createToken(username);// 保存token到数据库中result.token = _token;result.save((err) => {if(err){console.log('error:' + err + 'token')}})if(result){res.send({success: true, msg: '登录成功', token: _token});}else{res.send({success: false, msg: '登录失败'});}}else{res.send({success: false, msg: '密码错误'});}});
});// token
router.post('/createtoken', function(req, res, next){let username = req.body.username;User.findOne({"username":username},(err, result) => {if(err){res.send({success: false, msg: '用户名不存在'})console.log('error:' + err);return;}console.log('result:',result)let token = createToken(username);result.token = token;result.save((err) => {if(err){console.log('error:' + err + 'token')}})if(result){res.send({success: true, msg: '登录成功', token: token});}else{res.send({success: false, msg: '登录失败'});}});
});// 删除用户// 删除用户时,验证token信息是否过期
router.get('/delete', checkToken, function(req, res, next){let _username = req.body.username;User.remove({username: _username}, (err, result) => {if(err){console.log('error:' + err);return;}res.send(result);});
});module.exports = router;

3:服务器端token生成文件createToken.js

const jwt = require('jsonwebtoken');module.exports = function(user_id){const token = jwt.sign({user_id: user_id}, '1025886304@qq.com', {expiresIn: 60  //过期时间设置为60});return token;
};

4:服务器端验证token是否正确文件checkToken.js

const jwt = require('jsonwebtoken');
//检查token是否过期module.exports = function(req, res, next) {   // 获取请求头文件中的token信息let token = req.body.token || req.query.token || req.headers['authorization'];console.log(token)// 解析 tokenif (token) {// 确认token是否正确let decoded = jwt.decode(token, '1025886304@qq.com');console.log(decoded,44444)// 验证token是否过期if(token && decoded.exp <= new Date()/1000){return res.json({ success: false, message: 'token过期' });}else{return next();}} else {// 如果没有token,则返回错误return res.status(403).send({success: false,message: '没有提供token!'});}
};

5:服务器端启动文件

const express = require("express");
var bodyParser=require('body-parser');
const app = express();
const api = require('./router/api')// 跨域设置
app.all("*", function(req, res, next) {res.header("Access-Control-Allow-Credentials", true);res.header("Access-Control-Allow-Origin", "*");res.header("Access-Control-Allow-Methods", "PUT,POST,GET,DELETE,OPTIONS");res.header("Content-Type", "application/json;charset=utf-8");// 设置请求头类型 添加tokenres.header('Access-Control-Allow-Headers', 'Content-Type, Content-Length, Authorization, Accept, X-Requested-With , yourHeaderFeild');next();
});app.use(bodyParser.urlencoded({extended:true}));app.use("/api", api);app.get('/', (req, res) => {res.send('Hello World');
});const port = process.env.PORT || 3001;app.listen(port, () => {console.log('Express server listening on port ' + port);
});module.exports = app;

6:vue中用户登录操作

login () {let params = new URLSearchParams();params.append('username', this.login_username);params.append('password', this.login_password);let _token = localStorage.getItem('token');let that = this;console.log(_token)axios.post('http://localhost:3001/api/login', params, {headers:{'Content-Type':'application/x-www-form-urlencoded','Authorization': _token}}).then(function(res){console.log(res)if(res.data.success){let token = res.data.token;localStorage.setItem('token', token);that.$router.push({path: '/index'})}}).catch(function(err){console.log(err)});},

  

   

转载于:https://www.cnblogs.com/sk-3/p/9188168.html

基于jwt的用户登录认证相关推荐

  1. SpringBoot 快速集成 JWT 实现用户登录认证

    前言:当今前后端分离时代,基于Token的会话保持机制比传统的Session/Cookie机制更加方便,下面我会介绍SpringBoot快速集成JWT库java-jwt以完成用户登录认证. 一.JWT ...

  2. ASP.NET WebApi 基于JWT实现Token签名认证

    一.前言 开发提供数据的WebApi服务,最重要的是数据的安全性.那么对于我们来说,如何确保数据的安全将会是需要思考的问题.在ASP.NET WebService服务中可以通过SoapHead验证机制 ...

  3. 【java】基于JWT的token身份认证方案

    1.概述 转载:基于JWT的token身份认证方案 2.使用JSON Web Token的好处 2.1 性能问题 验证信息可以由前端保存,后端不需要为保存token消耗内存.JWT方式将用户状态分散到 ...

  4. 用户修改了信息jwt服务器怎么识别,django使用JWT保存用户登录信息

    什么是JWT? Json web token (JWT), 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准((RFC 7519).该token被设计为紧凑且安全的,特别适用于分布式站 ...

  5. Spring Cloud入门-Oauth2授权之基于JWT完成单点登录(Hoxton版本)

    文章目录 Spring Cloud入门系列汇总 摘要 单点登录简介 创建oauth2-client模块 修改授权服务器配置 网页单点登录演示 调用接口单点登录演示 oauth2-client添加权限校 ...

  6. java通过ldap添加用户后_ldap连接不上改用户_JAVA通过LDAP做用户登录认证,怎么做业务的异常处理?...

    通过java.namming包实现LDAP用户登录认证,怎么区分账号被冻结.停用.不存在等异常的业务情况呢? 参考的是:网上普遍流传的LDAP连接的代码 public boolean auth(Str ...

  7. java用户的登录图片_Java 如何用 token 做用户登录认证

    1.什么是 token??? Token 是服务端生成的一串字符串,以作客户端进行请求的一个令牌. 2.token 做用户登录认证 ● 流程 3. Java 实现 ● 用户登录生成 token,保存到 ...

  8. java+登录window域认证网页_Java 如何用 token 做用户登录认证

    1.什么是 token??? Token 是服务端生成的一串字符串,以作客户端进行请求的一个令牌. 2.token 做用户登录认证 ● 流程 3. Java 实现 ● 用户登录生成 token,保存到 ...

  9. php注册登录描述,基于PHP实现用户登录注册功能的详细教程

    教程前先给大家看看小编的实现成果吧! 图1: 图2: 图3: 教程: 实现这个功能我们需要五个php文件: login.php (登录界面,如图2) 登录 登录页面 用户名: required=&qu ...

最新文章

  1. 有一个1亿结点的树,已知两个结点, 求它们的最低公共祖先!
  2. idea没有错误出现红色波浪线怎么去掉?
  3. Android Butterknife 8.4.0 使用方法总结
  4. 虚拟的云服务器需要重启吗,虚拟主机重启服务器吗
  5. std::priority_queue
  6. Linux下 /dev/null 21 相关知识说明
  7. LeetCode 718. 最长重复子数组(DP)
  8. 软件开发管理(产品经理客户和程序员互撕解决方案)
  9. 实践GoF的设计模式:单例模式
  10. [分享]iOS开发-实现UILabel显示出不同颜色并且某一部分产生下划线的效果 ...
  11. mongodb从3.2升级到4.4_人教版六年级下册数学微课视频及练习4.4.2 比例尺的应用...
  12. 固定dll的加载基址的方法
  13. Python基于 ImageAI 模块实践 idenprof数据集识别预测分析
  14. mysql备份文件无法回退_mysql备份灵活恢复
  15. 如何编写高质量的程序
  16. 基于C++的简易的国际象棋双人对战程序设计
  17. vscode工作区是什么意思_VS Code中的“工作区”是什么?
  18. HTML5期末大作业:旅游网站设计——北京旅游(1页) 北京旅游网页设计制作 简单静态HTML网页作品 我的旅游网页作业成品 学生旅游网站模板
  19. 一款不错的Android环形进度条
  20. CAS单点登录:CAS服务端搭建

热门文章

  1. Cygwin的安装及在Android jni中的简单使用举例
  2. 【经验】向word中插入格式化的代码块
  3. 【C++】Google C++编码规范(四):其他C++
  4. android软件安全权威指南 pdf_AV-TEST 发布 2019 最佳 Android 安全软件榜单
  5. 替换某个字符串_postman教程-10-如何在集合中快速查询和替换数据
  6. Linux服务器部署ssl证书教程,linux服务器在wdcp面板安装ssl证书教程
  7. 极小连通子图和极大连通子图_强连通分量与拓扑排序
  8. markdown自动生成侧边栏TOC /目录
  9. print、printf、println在Java中的使用
  10. 程序模拟电影院窗口卖票,多线程Demo