第10章 Express进行认证和授权(一)

用户认证与授权是Web应用开发中的关键部分,它涉及到如何验证用户的身份以及如何管理用户对应用中不同资源的访问权限。通过用户认证,应用可以识别用户的身份,而通过授权,应用可以控制用户访问资源的权限。本章将详细介绍如何在Express应用中实现用户注册与登录、使用JWT进行身份验证以及使用Passport.js实现认证。

1. 用户注册与登录

用户注册与登录是用户认证的基础步骤,涉及到用户信息的存储与验证。

用户注册

用户注册通常包括接收用户的注册信息(如用户名、密码、电子邮件等),将用户信息存储到数据库,并返回注册结果。

数据库模型

首先,定义用户模型,以MongoDB为例:

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

const UserSchema = new mongoose.Schema({
    name: String,
    email: {
        type: String,
        unique: true,
        required: true
    },
    password: {
        type: String,
        required: true
    }
});

// 在保存用户之前加密密码
UserSchema.pre('save', async function (next) {
    if (this.isModified('password') || this.isNew) {
        this.password = await bcrypt.hash(this.password, 10);
    }
    next();
});

const User = mongoose.model('User', UserSchema);
注册路由
app.post('/register', async (req, res) => {
    try {
        const { name, email, password } = req.body;
        const user = new User({ name, email, password });
        await user.save();
        res.status(201).send({ message: 'User registered successfully' });
    } catch (error) {
        res.status(400).send({ error: 'User registration failed', details: error.message });
    }
});
用户登录

用户登录包括验证用户提交的登录信息,并在验证通过后生成一个会话或令牌。

登录路由
const jwt = require('jsonwebtoken');
const secret = 'your_jwt_secret';

app.post('/login', async (req, res) => {
    try {
        const { email, password } = req.body;
        const user = await User.findOne({ email });
        if (!user || !await bcrypt.compare(password, user.password)) {
            return res.status(401).send({ error: 'Invalid email or password' });
        }
        const token = jwt.sign({ userId: user._id }, secret, { expiresIn: '1h' });
        res.send({ message: 'Login successful', token });
    } catch (error) {
        res.status(500).send({ error: 'Login failed', details: error.message });
    }
});
2. 使用 JWT 进行身份验证

JSON Web Token(JWT)是一种常用的身份验证机制,通过生成和验证令牌来实现无状态的用户认证。

生成JWT

在用户登录成功后,生成一个JWT令牌,并将其返回给客户端:

const token = jwt.sign({ userId: user._id }, secret, { expiresIn: '1h' });
验证JWT

在需要保护的路由中,验证请求中包含的JWT令牌:

const authenticateJWT = (req, res, next) => {
    const token = req.header('Authorization').replace('Bearer ', '');
    if (!token) {
        return res.status(401).send({ error: 'Access denied' });
    }
    try {
        const decoded = jwt.verify(token, secret);
        req.user = decoded;
        next();
    } catch (error) {
        res.status(401).send({ error: 'Invalid token' });
    }
};

app.get('/protected', authenticateJWT, (req, res) => {
    res.send({ message: 'This is a protected route', user: req.user });
});
  • 14
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值