使用mongoose和bcrypt实现用户密码加密的示例

yizhihongxing

使用mongoose和bcrypt可以很方便地实现用户密码加密和解密。下面是实现的具体步骤:

  1. 在Node.js项目中安装mongoose和bcrypt

可以通过npm命令在项目中安装mongoose和bcrypt:

npm install mongoose bcrypt --save
  1. 创建一个mongoose模型

创建一个user模型来存储用户的信息,包括用户名和密码。在模型中需要定义一个pre(‘save’)的hook,在保存用户信息之前对密码进行加密。

const mongoose = require('mongoose');
const bcrypt = require('bcrypt');

const userSchema = new mongoose.Schema({
    username: {
        type: String,
        required: true,
        unique: true,
        trim: true
    },
    password: {
        type: String,
        required: true,
        trim: true
    }
});

userSchema.pre('save', async function(next) {
    const user = this;
    if (user.isModified('password')) {
        user.password = await bcrypt.hash(user.password, 8);
    }
    next();
});

const User = mongoose.model('User', userSchema);

module.exports = User;
  1. 创建一个控制器来处理用户的注册和登录请求

在控制器中,可以利用mongoose提供的findOne方法来查询用户信息。在登录的时候,需要使用bcrypt提供的compare方法来验证用户密码是否正确。

const User = require('../models/user');

exports.register = async (req, res) => {
    const user = new User(req.body);
    try {
        await user.save();
        res.status(201).send(user);
    } catch (error) {
        res.status(400).send(error);
    }
};

exports.login = async (req, res) => {
    try {
        const user = await User.findOne({ username: req.body.username });
        if (!user) {
            return res.status(404).send({ error: 'User not found' });
        }
        const isMatch = await bcrypt.compare(req.body.password, user.password);
        if (!isMatch) {
            return res.status(400).send({ error: 'Invalid login credentials' });
        }
        res.send(user);
    } catch (error) {
        res.status(500).send(error);
    }
};
  1. 在路由中使用控制器来处理请求

将控制器中的register和login方法分别绑定到路由的POST方法中,用于处理用户的注册和登录请求。

const express = require('express');
const userController = require('../controllers/user');
const router = express.Router();

router.post('/register', userController.register);
router.post('/login', userController.login);

module.exports = router;
  1. 完整示例

下面是一个完整的示例,使用Express和MongoDB来创建一个用户注册和登录的API。

const express = require('express');
const mongoose = require('mongoose');
const userRouter = require('./routers/user');

const app = express();

const mongoDBURL = 'mongodb://localhost:27017/myapp';
mongoose.connect(mongoDBURL, {
    useNewUrlParser: true,
    useUnifiedTopology: true,
    useCreateIndex: true,
    useFindAndModify: false
});

app.use(express.json());
app.use(userRouter);

app.listen(3000, () => {
    console.log('Server is up and running on port 3000');
});
  1. 示例说明

(1)注册用户示例:

请求URL:POST http://localhost:3000/register

请求Body:

{
    "username": "admin",
    "password": "123456"
}

响应结果:

HTTP状态码:201

{
    "_id": "5fd2f695471cb02f58db9019",
    "username": "admin",
    "password": "$2b$08$Lb9ZGeDUfdUKLr.CqD0asOuc107t3gM7mq3cqk0GJOsMkI96o/3v2",
    "__v": 0
}

(2)登录用户示例:

请求URL:POST http://localhost:3000/login

请求Body:

{
    "username": "admin",
    "password": "123456"
}

响应结果:

HTTP状态码:200

{
    "_id": "5fd31e783636d224d4d38437",
    "username": "admin",
    "password": "$2b$08$jKF7WbPGqWrNfpMN02UHluW4jWkZz5R7Vx4JWigfG5kCj06fpPpwK",
    "__v": 0
}

以上便是使用mongoose和bcrypt实现用户密码加密的完整攻略,其中包含了模型定义、控制器编写、路由设置等细节,可以帮助开发者实现安全稳定的用户认证和授权。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:使用mongoose和bcrypt实现用户密码加密的示例 - Python技术站

(0)
上一篇 2023年5月25日
下一篇 2023年5月25日

相关文章

  • 教你快速构建一个基于nginx的web集群项目

    下面是“教你快速构建一个基于nginx的web集群项目”的完整攻略。 1. 购买服务器 首先,我们需要购买至少两台运行Linux操作系统的服务器,这些服务器可以是云服务器或者是自己购买的物理服务器。这些服务器需要满足以下要求: 至少需要2台服务器,分别作为Nginx负载均衡器和Web服务器。 需要配置好网络环境,保证服务器之间能够相互通信。 2. 安装Ngi…

    人工智能概览 2023年5月25日
    00
  • Python Django 添加首页尾页上一页下一页代码实例

    下面是Python Django 添加首页尾页上一页下一页代码的详细攻略。 1. 编写视图函数 在 Django 中,对于分页操作,我们需要自定义视图函数来实现。这个函数需要对数据进行分页,并将分页后的数据传递到模板中。下面是一个示例代码: def index(request): current_page = request.GET.get(‘page’) …

    人工智能概论 2023年5月25日
    00
  • python批量生成本地ip地址的方法

    确实,Python是一个功能强大的编程语言,可以用来创建更高级的网络应用程序。在本地环境中,经常需要用到一些局域网的IP地址,而手工输入比较烦琐,因此,本文将介绍如何使用Python自动批量生成本地IP地址的方法。 生成本地IP地址 为了生成本地IP地址,我们需要知道本地网络的网络地址和子网掩码。这些信息可以通过在终端上输入ipconfig(Windows)…

    人工智能概览 2023年5月25日
    00
  • windows安装mongodb6.x并设置用户名密码的详细过程

    下面是详细讲解“Windows安装MongoDB6.x并设置用户名密码的详细过程”的完整攻略。 安装MongoDB6.x 打开MongoDB官网(https://www.mongodb.com/),在页面右上角点击“Get MongoDB”进入下载页面。 在下载页面中选择“Community Server”,根据系统版本选择下载对应的安装包。在下载过程中,需…

    人工智能概览 2023年5月25日
    00
  • 详细记一次Docker部署服务的爬坑历程

    详细记一次Docker部署服务的爬坑历程 概述 Docker是一种轻量级的虚拟化技术,可以将应用程序和其所需的依赖项打包到一个容器中,以便可以在任何地方运行。Docker部署服务比传统方式更加灵活和方便,但如果不注意一些要点就有可能遇到一些问题。在这篇文章中,我们将会分享如何在Docker中部署服务时的一些注意事项和一些可能会遇到的问题以及如何解决这些问题。…

    人工智能概览 2023年5月25日
    00
  • 基于MongoDB数据库的数据类型和$type操作符详解

    下面开始详细讲解“基于MongoDB数据库的数据类型和$type操作符详解”完整攻略。 数据类型和类型检查操作符 在MongoDB数据库中,有几种数据类型,每种数据类型对应一些类型检查操作符。这些操作符可以被用于查询和操作MongoDB数据库中的数据。 以下是MongoDB支持的数据类型: Null:用于存储空值 String:用于存储字符和文本 Boole…

    人工智能概论 2023年5月25日
    00
  • Win10下android studio开发环境配置图文教程

    Win10下安装配置Android Studio 1. 下载安装JDK 首先我们需要下载并安装Java Development Kit (JDK),在Oracle官网下载与你的系统对应版本的JDK。安装完成后,需要将JDK的bin目录添加到系统的PATH环境变量中。 2. 下载和安装Android Studio 在官方网站下载Android Studio安装…

    人工智能概览 2023年5月25日
    00
  • 构建可视化 web的 Python 神器streamlit

    下面是“构建可视化 web的 Python 神器Streamlit”的完整攻略: 简介 Streamlit是一种基于Python的工具,可用于快速构建数据科学和机器学习应用程序的可视化界面,它可以让你以极少的代码轻松实现各种交互式图表和应用程序。 安装 请确保已经安装了Python和pip。在命令行中运行以下命令: pip install streamlit…

    人工智能概览 2023年5月25日
    00
合作推广
合作推广
分享本页
返回顶部