在 Node.js 中实现用户认证与授权

在 Node.js 中实现用户认证与授权

在现代Web应用中,用户认证与授权是至关重要的一环。无论是一个简单的博客系统,还是一个复杂的电子商务平台,都需要确保用户的身份是可信的,同时根据用户的角色或权限提供不同的访问级别。本文将介绍如何在 Node.js 中实现基本的用户认证与授权,并附带示例代码为您提供参考。

一、基础概念

在谈论用户认证和授权之前,首先要了解这两个概念的区别:

  • 用户认证(Authentication):验证用户的身份,确认用户是谁。这通常通过用户名和密码来实现。
  • 用户授权(Authorization):确认用户是否有权限执行某个操作,决定用户可以做什么。

二、技术栈

在本篇文章中,我们将使用以下技术栈:

  • Node.js:作为JavaScript的运行环境。
  • Express.js:一个简洁的Web框架,用于构建Web服务器。
  • MongoDB:一个NoSQL数据库,用于存储用户数据。
  • Mongoose:MongoDB的对象建模工具,可以简化与数据库的交互。
  • JWT(JSON Web Token):用于在网络应用中安全地传递信息。

三、环境搭建

1. 安装Node.js和相关依赖

首先确保你本地安装了 Node.js 和 npm。然后可以使用以下命令创建一个新的项目:

mkdir user-auth-example
cd user-auth-example
npm init -y

接下来安装所需的依赖项:

npm install express mongoose bcryptjs jsonwebtoken dotenv

2. 创建基本的目录结构

在项目根目录下,创建一个server.js文件和一个名为models的文件夹。

四、构建用户模型

models文件夹中创建一个User.js文件,用于定义用户模型。

// models/User.js

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

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

// 密码加密
userSchema.pre('save', async function(next) {
    if (!this.isModified('password')) return next();
    this.password = await bcrypt.hash(this.password, 10);
    next();
});

// 密码比较
userSchema.methods.comparePassword = async function(password) {
    return await bcrypt.compare(password, this.password);
};

module.exports = mongoose.model('User', userSchema);

在这个文件中,我们定义了一个用户模型,包括用户名和密码字段。在用户保存到数据库之前,密码会被加密。在比较密码时,我们使用bcrypt来处理。

五、搭建Express应用

在根的server.js文件中,搭建基本的Express应用。

// server.js

const express = require('express');
const mongoose = require('mongoose');
require('dotenv').config();

const app = express();
app.use(express.json());

const PORT = process.env.PORT || 5000;

// 连接 MongoDB 数据库
mongoose.connect(process.env.MONGODB_URI, { useNewUrlParser: true, useUnifiedTopology: true })
    .then(() => console.log('MongoDB connected'))
    .catch(err => console.error(err));

// 用户注册接口
app.post('/api/register', async (req, res) => {
    const { username, password } = req.body;

    try {
        const newUser = new (require('./models/User'))({ username, password });
        await newUser.save();
        res.status(201).send('User registered');
    } catch (err) {
        res.status(400).send(err.message);
    }
});

// 用户登录接口
app.post('/api/login', async (req, res) => {
    const { username, password } = req.body;

    const User = require('./models/User');
    const user = await User.findOne({ username });

    if (!user || !(await user.comparePassword(password))) {
        return res.status(401).send('Invalid credentials');
    }

    const token = require('jsonwebtoken').({ userId: user._id }, process.env.JWT_SECRET, { expiresIn: '1h' });
    res.json({ token });
});

// 启动服务器
app.listen(PORT, () => {
    console.log(`Server is running on port ${PORT}`);
});

在这个文件中,我们设置了两个API,一个用于用户注册,另一个用于用户登录。在用户成功登录后,我们会生成一个JWT,并将其发送回客户端。

六、用户授权

为了演示用户授权,我们将创建一个简单的中间件,用于检查用户是否已登录。

// middleware/auth.js

const jwt = require('jsonwebtoken');

const authenticate = (req, res, next) => {
    const token = req.header('Authorization').replace('Bearer ', '');
    
    if (!token) return res.status(401).send('Access denied. No token provided.');

    try {
        const decoded = jwt.verify(token, process.env.JWT_SECRET);
        req.user = decoded;
        next();
    } catch (ex) {
        res.status(400).send('Invalid token.');
    }
};

module.exports = authenticate;

现在,我们可以在有需要进行用户权限控制的路由中使用这个中间件。

1. 受保护的路由示例

server.js中添加一个受保护的路由:

// 获取用户信息接口
.get('/api/profile', authenticate, (req, res) => {
    res.send(`Hello, your user ID is: ${req.user.userId}`);
});

当用户登录后,可以使用生成的JWT访问/api/profile路由,响应时服务器将返回用户ID。

七、总结

到现在为止,我们已经在Node.js中实现了一个基本的用户认证和授权体系。我们使用了Express框架、MongoDB数据库以及JWT进行身份验证和授权。通过这种方式,我们不仅能够确保用户身份的正确性,同时也能根据权限管理用户的访问。


最后问候亲爱的朋友们,并邀请你们阅读我的全新著作

书籍详情

在这里插入图片描述

Node.js,可以使用不同的方法来实现用户认证授权。一个常见的方法是使用Session认证机制,这可以通过在服务器端渲染使用。另一个方法是使用JWT认证机制,这适用于前后端分离的开发模式。以下是对这两种方法的简要介绍: 1. Session认证机制:Session认证是一种基于服务器端的身份认证机制。它的实现方式是,在用户登录时,服务器会为该用户创建一个唯一的会话标识(通常是一个Session ID),并将该会话标识存储在服务器的内存或数据库。随后,每次用户发送请求时,服务器会检查请求是否包含有效的会话标识,并验证该会话标识的有效性。如果验证通过,则认为用户是合法的,可以授予相应的权限。Session认证机制可以结合其他技术(如Cookie)来实现用户的持久登录状态。这种方法适用于服务器端渲染的开发模式。 2. JWT认证机制:JWT(JSON Web Token)是一种基于令牌的身份认证机制,适用于前后端分离的开发模式。它的实现方式是,在用户登录成功后,服务器会生成一个JWT令牌,并将其返回给客户端。客户端在后续的请求,将该令牌作为身份认证的凭证发送给服务器。服务器接收到令牌后,会对其进行验证,并解析出其用户信息。JWT令牌包含了用户的身份信息以及一些签名信息,因此具有防伪造的特性。使用JWT认证机制可以在前后端分离的情况下实现用户认证授权。 总结起来,在Node.js,可以使用Session认证机制或JWT认证机制来实现用户认证授权,具体选择哪种方法取决于开发模式和需求。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [Node.js使用jwt或session实现前后端身份认证](https://blog.csdn.net/SongD1114/article/details/123932616)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *3* [Node.js的Web后端开发调研](https://blog.csdn.net/fireroll/article/details/127465892)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

JJCTO袁龙

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值