Node.js用户登录功能实现
开发
实现用户登录功能的完整解决方案
在现代Web应用中,用户登录功能是必不可少的模块。本文将以Node.js和Express框架为例,介绍如何实现一个简单且安全的用户登录功能,包含用户认证、密码加密和会话管理。
一、功能需求分析
- 用户能够通过用户名和密码登录系统
- 密码在数据库中采用加密存储
- 登录成功后,用户会话保持状态,便于访问受保护资源
- 登录失败时,给出明确提示
二、技术选型
- Node.js + Express:搭建后端服务
- bcrypt:用于密码加密和验证
- express-session:管理用户会话
- MongoDB(Mongoose):存储用户数据
三、实现步骤
- 初始化项目并安装依赖
mkdir user-login-demo
cd user-login-demo
npm init -y
npm install express mongoose bcrypt express-session body-parser
- 创建服务器入口文件
app.js
const express = require('express');
const session = require('express-session');
const bodyParser = require('body-parser');
const mongoose = require('mongoose');
const bcrypt = require('bcrypt');
const app = express();
app.use(bodyParser.urlencoded({ extended: false }));
app.use(session({
secret: 'your_secret_key',
resave: false,
saveUninitialized: false,
}));
// 连接MongoDB
mongoose.connect('mongodb://localhost:27017/userLoginDemo', {
useNewUrlParser: true,
useUnifiedTopology: true,
});
// 定义用户模型
const userSchema = new mongoose.Schema({
username: String,
password: String,
});
const User = mongoose.model('User', userSchema);
// 渲染登录页(简单示例)
app.get('/login', (req, res) => {
res.send(`
<form method="POST" action="/login">
<input name="username" placeholder="用户名" required />
<input name="password" type="password" placeholder="密码" required />
<button>登录</button>
</form>
`);
});
// 处理登录请求
app.post('/login', async (req, res) => {
const { username, password } = req.body;
const user = await User.findOne({ username });
if (!user) {
return res.send('用户不存在');
}
const match = await bcrypt.compare(password, user.password);
if (!match) {
return res.send('密码错误');
}
// 保存登录状态
req.session.userId = user._id;
res.send('登录成功');
});
// 受保护路由示例
app.get('/dashboard', (req, res) => {
if (!req.session.userId) {
return res.status(401).send('请先登录');
}
res.send('欢迎来到用户中心');
});
// 用户注册接口(示例)
app.get('/register', (req, res) => {
res.send(`
<form method="POST" action="/register">
<input name="username" placeholder="用户名" required />
<input name="password" type="password" placeholder="密码" required />
<button>注册</button>
</form>
`);
});
app.post('/register', async (req, res) => {
const { username, password } = req.body;
const existingUser = await User.findOne({ username });
if (existingUser) {
return res.send('用户名已存在');
}
const hashedPassword = await bcrypt.hash(password, 10);
const newUser = new User({ username, password: hashedPassword });
await newUser.save();
res.send('注册成功');
});
app.listen(3000, () => {
console.log('服务器已启动,端口3000');
});
四、代码说明
- 使用
express-session
管理用户会话,登录成功后将用户ID保存在session中。 - 密码通过
bcrypt.hash
加密存储,登录时通过bcrypt.compare
验证密码。 - 提供注册接口供用户创建账号。
- 受保护路由
/dashboard
通过检查session判断用户是否登录。
五、测试步骤
- 启动MongoDB服务。
- 运行
node app.js
启动服务器。 - 访问
http://localhost:3000/register
注册新用户。 - 访问
http://localhost:3000/login
登录。 - 登录成功后访问
http://localhost:3000/dashboard
,看到欢迎信息。 - 未登录访问
/dashboard
则提示需要登录。
总结 本文介绍了一个基础的用户登录功能实现方案,从注册用户、密码加密、登录验证到会话管理,覆盖了功能的核心点。开发者可以在此基础上扩展更多功能,如前端页面改进、验证码、多因素认证等,提升系统安全性和用户体验。
编辑:一起学习网