VB.net 2010 视频教程 VB.net 2010 视频教程 VB.net 2010 视频教程
SQL Server 2008 视频教程 c#入门经典教程 Visual Basic从门到精通视频教程
当前位置:
首页 > 网站开发 > JQuery >
  • JavaScript教程之基于jwt的用户登录认证

  • 2019-04-27 14:57 来源:未知

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

token认证流程:

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

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

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

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

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

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

 

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
'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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
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;