ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

【 Node 】Token的生成与验证、密码的加密与验证

2021-11-14 17:32:22  阅读:156  来源: 互联网

标签:Node const 验证 require req token Token user passport


目录结构

在这里插入图片描述

搭建服务器

express框架
mongoose连接数据库
配置passport 方便后面的token验证
server.js

const express = require('express');
const app = express();
const mongoose = require('mongoose');

// 验证token
const passport = require('passport');

// 引入路由
const users = require('./routes/api/users');

// 使用中间件
app.use(express.json());
app.use(express.urlencoded({ extended: false }));

// mongodb config
const dbUrl = require('./config/keys').mongoURI;
// mongodb connect
mongoose.connect(dbUrl, { useNewUrlParser: true, useUnifiedTopology: true })
    .then(() => {
        console.log('数据库连接成功');
    })
    .catch(err => {
        console.log('数据库连接失败', err);
    })


// 初始化passport
app.use(passport.initialize());
// 配置passport
require('./config/passport')(passport);

// 使用路由
app.use('/api/users', users)

const port = process.env.PORT || 5000;
app.listen(port, () => {
    console.log(`Server is running on port ${port}`);
})

注册

使用bcrypt对密码加密

const express = require('express');
const router = express.Router();
// 引入加密模块
const bcrypt = require('bcrypt');
// 引入数据模型
const User = require('../../models/User');

// @route POST api/users/register
// @desc 注册
// @access public
router.post('/register', (req, res) => {
    // 检测是否已经注册 查询是否拥有邮箱
    User.findOne({ email: req.body.email })
        .then((user) => {
            if (user) {
                return res.status(400).json('邮箱已经被注册')
            } else {
                // 设置头像
                var avatar = gravatar.url(req.body.email, { s: '200', r: 'pg', d: 'mm' });
                // 创建用户
                const newUser = new User({
                    name: req.body.name,
                    email: req.body.email,
                    avatar,
                    identity: req.body.identity,
                    password: req.body.password
                })
                // 加密密码 
                bcrypt.genSalt(10, function (err, salt) {
                    bcrypt.hash(newUser.password, salt, function (err, hash) {
                        if (err) throw err;
                        // 已经加密的密码
                        newUser.password = hash;

                        // 存储用户
                        newUser.save()
                            .then(user => res.json(user))
                            .catch(err => console.log(err))
                    });
                });

            }
        })
})

在这里插入图片描述
在这里插入图片描述

登录

先使用bcrypt校验密码是否正确
使用jsonwebtokne 生成token
jsonwebtoken

const express = require('express');
const router = express.Router();
// 引入加密模块
const bcrypt = require('bcrypt');
// 引入头像模块
const gravatar = require('gravatar');
// 引入数据模型
const User = require('../../models/User');
// 引入token配置
const jwt = require('jsonwebtoken');
// 引入token配置名字
const Keys = require('../../config/keys');

// @route GET api/users/login
// @desc 登录 返回token
// @access public
router.post('/login', (req, res) => {
    const email = req.body.email;
    const password = req.body.password;
    // 查询邮箱是否存在
    User.findOne({ email })
        .then(user => {
            if (!user) {
                return res.status(404).json('邮箱不存在')
            }
            // 用户存在 检查密码
            bcrypt.compare(password, user.password)
                .then(isMatch => {
                	// 密码匹配 配置token
                    if (isMatch) {
                        // 定义规则
                        const rule = { id: user.id, name: user.name, avatar: user.avatar, identity: user.identity };
                        // jwt.sign('加密规则','加密名字(单独写在其他文件里面在 引入使用)','过期时间(s)',箭头函数)
                        // 配置token
                        jwt.sign(rule, Keys.secretOrKey, { expiresIn: 3600 }, (err, token) => {
                            if (err) throw err;
                            // 返回token
                            res.json({
                                success: true,
                                token: 'Bearer ' + token
                            })
                        })
                    } else {
                        return res.status(400).json('密码不匹配')
                    }
                })
        })
        .catch(err => console.log(err))
})

在这里插入图片描述

携带Token获取信息

在server.js里面需要引入 passport并初始化、配置

router.get('/current', passport.authenticate('jwt', { session: false }), (req, res) => {
    // 验证成功 返回下列数据
    res.json({
        id: req.user.id,
        name: req.user.name,
        email: req.user.email,
        identity: req.user.identity
    })
})

passport配置
config / passport.js

// 验证token
const JwtStrategy = require('passport-jwt').Strategy,
    ExtractJwt = require('passport-jwt').ExtractJwt;
const opts = {}
opts.jwtFromRequest = ExtractJwt.fromAuthHeaderAsBearerToken();

// 引入数据库
const mongoose = require('mongoose');
// 引入数据模型
const User = mongoose.model('users');

// 设置jsonwebtoken的策略
const keys = require('../config/keys');
opts.secretOrKey = keys.secretOrKey;

module.exports = passport => {
    passport.use(new JwtStrategy(opts, (jwt_payload, done) => {
        User.findById(jwt_payload.id)
            .then(user => {
                if (user) {
                    return done(null, user);
                }
                return done(null, false);
            })
            .catch(err => {
                console.log(err);
            })
    }));
}

不携带token
在这里插入图片描述
携带token
在这里插入图片描述

标签:Node,const,验证,require,req,token,Token,user,passport
来源: https://blog.csdn.net/Twisted_/article/details/121319612

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有