基于jwt的用户登录认证
最近在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
}, '1000000000@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)
// 解析 token
if (token) {
// 确认token是否正确
let decoded = jwt.decode(token, '1000000000@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");
// 设置请求头类型 添加token
res.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)
});
},
基于jwt的用户登录认证的更多相关文章
- 基于JWT的Token登录认证(一)
1.JWT简介 JSON Web Token(缩写 JWT),是目前最流行的跨域认证解决方案. session登录认证方案:用户从客户端传递用户名.密码等信息,服务端认证后将信息存储在session中 ...
- 基于JWT的Token登录认证
1.JWT简介 JSON Web Token(缩写 JWT),是目前最流行的跨域认证解决方案. 2.JWT的原理 JWT的原理是,服务器认证以后,生成一个JSON格式的对象,发回给客 ...
- 基于SpringSecurity和JWT的用户访问认证和授权
发布时间:2018-12-03 技术:springsecurity+jwt+java+jpa+mysql+mysql workBench 概述 基于SpringSecurity和JWT的用户访 ...
- ASP.NET Web API 2系列(四):基于JWT的token身份认证方案
1.引言 通过前边的系列教程,我们可以掌握WebAPI的初步运用,但是此时的API接口任何人都可以访问,这显然不是我们想要的,这时就需要控制对它的访问,也就是WebAPI的权限验证.验证方式非常多,本 ...
- 2018-8-16JWTtoken用户登录认证思路分析9502751
2018-8-16JWTtoken用户登录认证思路分析9502751 JWT token在商城中的实现 class UserView(CreateAPIView): serializer_class ...
- ASP.NET WebApi 基于JWT实现Token签名认证
一.前言 明人不说暗话,跟着阿笨一起玩WebApi!开发提供数据的WebApi服务,最重要的是数据的安全性.那么对于我们来说,如何确保数据的安全将会是需要思考的问题.在ASP.NET WebServi ...
- .NetCore WebApi——基于JWT的简单身份认证与授权(Swagger)
上接:.NetCore WebApi——Swagger简单配置 任何项目都有权限这一关键部分.比如我们有许多接口.有的接口允许任何人访问,另有一些接口需要认证身份之后才可以访问:以保证重要数据不会泄露 ...
- 基于cookie的用户登录状态管理
cookie是什么 先来花5分钟看完这篇文章:https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Cookies 看完上文,相信大家对cookie已经有 ...
- django rest_framework 实现用户登录认证
django rest_framework 实现用户登录认证 1.安装 pip install djangorestframework 2.创建项目及应用 创建过程略 目录结构如图 3.设置setti ...
随机推荐
- WebWorker 简单使用方式
WebWorker 一定程度上可以算得上是浏览器中的多线程技术了,在项目中适当使用 Worker 来做一些耗时的操作能大大提高页面整体流畅度. Worker的使用也是非常简单的,通过向 Worker ...
- LDA && NCA: 降维与度量学习
已迁移到我新博客,阅读体验更佳LDA && NCA: 降维与度量学习 代码实现放在我的github上:click me 一.Linear Discriminant Analysis(L ...
- Sqlserver事务隔离级别详解
sqlserver存储方式 页 sqlserver是以页的形式存储数据,每个数据页的大小为8KB,sqlserver会把空间分为多个页,sqlserver与数据交互单位最小的io操作就是页级 ...
- 企业级Harbor介绍及安装
企业级Harbor介绍及安装 一.Harbor介绍 VMware公司最近开源了企业级Registry项目Harbor,其的目标是帮助用户迅速搭建一个企业级的Docker registry 服务.它以D ...
- 移动端布局方案汇总&&原理解析
阿里flexible布局 - 版本1.x 该布局于 2017年8月9日被2.0版本取代 实现原理 假设(UI稿750px宽) 设置viewport的 scale = 1/window.devicePi ...
- 好程序员web前端分享CSS基础篇
学习目标 1.CSS简介 2.CSS语法 3.样式的创建 4.两种引入外部样式表的区别 5.样式表的优先级和作用域 6.CSS选择器 7.选择器的权重 8.浮动属性的简单应用 9.HTML.CSS注释 ...
- Cocos Creator—定制H5游戏首页loading界面
Cocos Creator从1.0版本发布到现在也有一年多了,按理说一些常见的问题网上都有解决方案,例如"如何自定义首页加载进度条界面"这种普遍需求,应该所有人都会遇到的,因此也有 ...
- 【Python实践-5】使用迭代查找一个list中最小和最大值
# -*- coding: utf-8 -*- #使用迭代查找一个list中最小和最大值,并返回一个tuple #遍历list,找到最小值 def findMinAndMax(L): if L==[] ...
- Oracle11g创建表空间、创建用户、角色授权、导入导出表以及中文字符乱码问题
[转载]原文地址:https://www.cnblogs.com/bjh1117/p/6605037.html 前提:本机已经安装了Oracle11g数据库. 需求:使用PL SQL数据库连接工具操作 ...
- PHP全栈学习笔记9
php的会话控制,什么是会话控制,http等. 什么是会话控制思想,http协议. cookie 和 session http是超文本传输协议,是网络上最广泛的一种网络协议. http最大特点是无连接 ...