IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> Node+Express+Mongodb实现登录注册 -> 正文阅读

[大数据]Node+Express+Mongodb实现登录注册

Node+Express+Mongodb实现登录注册

思路:当用户登录的时候去判断数据库中是否有该用户名,如果有,验证用户输入的密码和数据库中存储的是否一致;如果没有,则提醒用户该账号不存在,应该去注册;注册的时候,将密码进行加密(用户的账号和密码要确保其安全性),可用bcrypt进行加密(它的原理输入的明文密码通过10次循环加盐后得到myHash(版本+salt),然后存入数据库。系统在验证用户时,需要从myHash中取出salt跟password进行hash;得到的结果保存在数据库中的hash进行比对,如果一致才算验证通过);登录的时候将生成的token传给前端,在需要的地方验证token。
(1)安装bcrypt进行加密,解密 npm install bcrypt --save
(2)安装jsonwebtoken,生成和验证token npm install jsonwebtoken
(3)使用 bcrypt.hashSync(password, 10) 对密码进行加密
(4)使用 bcrypt.compareSync(password, data.password) 验证密码的正确性
(5)使用 jwt.sign(data, ‘wx’, { expiresIn: 10 1 })* 生成token
(6)使用 jwt.verify(验证的token,自定义密钥,回调) 验证token

写登录注册的模块login.js

//引入express模块
const express = require('express')
//路由
const router = express.Router()
//引入密码加密模块
const bcrypt = require('bcrypt')
//引入生成token
const jwt = require('jsonwebtoken')
//引入数据库模块
const mongoose = require('mongoose')
//连接本地数据库
mongoose.connect('mongodb://localhost:27017/loveHome')
let db = mongoose.connection
//连接的表
let loginCollection = db.collection('login')
//注册
router.post('/register', (req, res) => {
  const { username, password, accountNumber } = req.body
  if (accountNumber && password) {
    // bcrypt.hashSync(密码,10位的盐)
    const hashPwd = bcrypt.hashSync(password, 10) // 使用bcrypt.hashSync方法生成密文密码
    //hashPwd随机生成的密文密码  $2b$10$jE1hhza0EZaxOyf9RtGVk.m79cA9CKt1Qnmony8cd7xzHoz95JlJq
    let obj = { username, password: hashPwd, accountNumber }
    //给login表插入要增加的内容
    //插入的密码是经过加密的,这样就算程序员也不知道密码是多少,保密性
    loginCollection.insertOne(obj, (err, result) => {
      if (result) {
        res.send({
          msg: '注册成功'
        })
      } else {
        res.send({
          msg: '注册失败'
        })
      }
    })

  } else {
    res.send({
      code: '111111',
      msg: '参数错误'
    })
  }
})
//登录
router.post('/login', (req, res) => {
  const { password, accountNumber } = req.body
  if (accountNumber && password) {
    //从表中查询账号
    loginCollection.findOne({ accountNumber }, (err, data) => {
      if (data) {
        //该账号存在,验证所输入的密码和数据库中的书否一样
        const isPwdValid = bcrypt.compareSync(password, data.password)  // 使用bcrypt.compareSync方法验证密码
        if (isPwdValid) {
          //如果密码正确, 生成token
          let token = jwt.sign(data, 'wx', { expiresIn: 10* 1 });
          res.send({
            msg: '登录成功',
            token: token,
            success:true,
            data:data
          })
        } else {
          res.send({
            msg: '密码错误',
            success:false,
          })
        }
      }else{
        res.send({
          msg: '该用户不存在,请注册',
          success:false,
        })
      }
    })


  } else {
    res.send({
      success:false,
      msg: '参数错误'
    })
  }
})
module.exports = router

app.js

// 引入express模块框架
var express = require('express');
var path = require('path');
// 引入路由模块
const loginRouter = require('./routes/login/login')
const pictureRouter = require('./routes/pictureMsg')
const {jwtCheck} = require('./routes/login/jwt')

// 创建一个express实例
var app = express();
//跨域
app.all('*', function (req, res, next) {
  res.header("Access-Control-Allow-Origin", "*");
  res.header("Access-Control-Allow-Headers", "*");
  //res.header('Access-Control-Allow-Headers',"token", 'Content-Type, Content-Length, Authorization, Accept, X-Requested-With , yourHeaderFeild');
  res.header("Access-Control-Allow-Methods", "PUT,POST,GET,DELETE,OPTIONS");
  res.header("X-Powered-By", ' 3.2.1')
  res.header("Content-Type", "application/json;charset=utf-8");
  next();
});

app.use(express.json());
app.use(express.urlencoded({ extended: false }));

//登录
app.use('/',loginRouter)
//在想要的地方插入中间件,验证token是否过期
//放在这,是因为想要进入下边的都必须保持登录,token存在的情况下
app.use(jwtCheck)
app.use(pictureRouter)

app.listen('3001', 'localhost', () => {
  console.log("启动成功")
})
module.exports = app;

jwt.js文件

// 生成token
const jwt = require('jsonwebtoken')
const jwtKey = 'wx' // token生成的密匙,根据自己需求定义

const jwtSign = (data) => { // token生成函数,有效时间为一个小时
  const token = jwt.sign(data, jwtKey, {expiresIn: 10 * 1})
  return token
}

const jwtCheck = (req, res, next) => { // token验证函数
  const token = req.headers.token
  jwt.verify(token, jwtKey, (err, data) => {
    if (err) {
      res.send({
        code: '1111',
        msg: 'token无效'
      })
    } else {
      req.jwtInfo = data
      next()
    }
  })
}

module.exports = {
  jwtSign,
  jwtCheck
}

个人练习,如果有不对的地方,或者我理解错的地方,希望各位可以指正,谢谢。

  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2022-04-22 18:43:14  更:2022-04-22 18:45:38 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 3:03:53-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码