发布于2026-07-26 阅读(0)
扫一扫,手机访问
在 Ubuntu 上搭建用户认证系统,用 Ja vaScript 走通整个流程,其实并不复杂。下面就把核心步骤拆开来讲,每一步都带着代码,方便你直接上手。

先挑个趁手的框架
Node.js 生态里 Express.js 是最常用的 Web 框架,没有之一。它把路由、中间件这些基础工作都封装好了,省去很多重复劳动。当然你也可以用 Koa 或 Fastify,但 Express 的社区资源最丰富,出了问题容易找到答案。
初始化项目,装好依赖
在 Ubuntu 终端里先建一个目录,然后跑 npm init -y 生成 package.json,接着安装下面几个包:
mkdir my-auth-app
cd my-auth-app
npm init -y
npm install express mongoose bcryptjs jsonwebtoken express-session
简单解释一下:express 是 Web 框架,mongoose 用来操作 MongoDB,bcryptjs 负责密码加密,jsonwebtoken 生成和验证 JWT,express-session 用于会话管理——虽然本例主要用 JWT,但 session 在某些场景下也会用到。
启动一个最基本的 Express 服务器
新建 app.js,写入以下代码:
const express = require('express');
const app = express();
const port = 3000;
app.use(express.json());
app.listen(port, () => {
console.log(`Server running on port ${port}`);
});
这里只做了两件事:引入 express,监听 3000 端口。稍后我们会把路由和数据库加进来。
定义用户模型,顺便把密码加密逻辑嵌进去
用 Mongoose 定义 Schema,关键点是在 pre('sa ve') 钩子里自动对密码进行加盐哈希——这样无论如何都不会存明文密码。
const mongoose = require('mongoose');
const bcrypt = require('bcryptjs');
const userSchema = new mongoose.Schema({
username: { type: String, unique: true },
password: String,
});
userSchema.pre('sa ve', async function (next) {
if (this.isModified('password') || this.isNew) {
const salt = await bcrypt.genSalt(10);
this.password = await bcrypt.hash(this.password, salt);
}
next();
});
const User = mongoose.model('User', userSchema);
注意 unique: true 保证了用户名不重复,而 genSalt(10) 的 10 是安全与性能的平衡点,生产环境可以适当调高。
注册路由:把新用户写入数据库
一个 POST 请求,接收 username 和 password,创建 User 实例后保存。如果用户名重复或参数有问题,mongoose 会抛异常,我们在 catch 里返回 500。
app.post('/register', async (req, res) => {
try {
const { username, password } = req.body;
const newUser = new User({ username, password });
await newUser.sa ve();
res.status(201).send('User created');
} catch (error) {
res.status(500).send(error.message);
}
});登录路由:验证密码后签发 JWT
通过用户名找到用户,用 bcrypt.compare 比对密码。如果匹配则生成一个有效期为 1 小时的 JWT,返回给客户端。
app.post('/login', async (req, res) => {
try {
const { username, password } = req.body;
const user = await User.findOne({ username });
if (!user || !(await bcrypt.compare(password, user.password))) {
return res.status(401).send('Invalid credentials');
}
const token = jwt.sign({ userId: user._id }, 'your_jwt_secret', { expiresIn: '1h' });
res.json({ token });
} catch (error) {
res.status(500).send(error.message);
}
});
这里 your_jwt_secret 只是一个示例,生产环境务必用环境变量或密钥管理服务来存放。
认证中间件:拦截请求并验证 Token
写一个 authenticateToken 函数,从请求头的 Authorization 字段中取出 Bearer token,然后用 jwt.verify 校验。如果 token 无效或过期,分别返回 401 或 403。
const jwt = require('jsonwebtoken');
const authenticateToken = (req, res, next) => {
const authHeader = req.headers['authorization'];
const token = authHeader && authHeader.split(' ')[1];
if (token == null) return res.sendStatus(401);
jwt.verify(token, 'your_jwt_secret', (err, user) => {
if (err) return res.sendStatus(403);
req.user = user;
next();
});
};受保护的路由:只有认证用户才能访问
在需要保护的路由上加上刚刚写的中间件,比如:
app.get('/protected', authenticateToken, (req, res) => {
res.json({ message: 'This is a protected route', user: req.user });
});
这样,只有携带有效 JWT 的请求才能看到 /protected 返回的内容。
连接 MongoDB 数据库
在应用启动前,调用 mongoose.connect。这里假设本地已经运行了 MongoDB 服务,数据库名是 my-auth-app。
mongoose.connect('mongodb://localhost:27017/my-auth-app', {
useNewUrlParser: true,
useUnifiedTopology: true,
});合并所有代码,启动服务器
把上面几段代码整合到一个 app.js 文件里,然后运行:
node app.js
如果一切顺利,终端会打印 Server running on port 3000,同时 MongoDB 连接成功。
最后多说两句:上面的示例只展示了核心逻辑,实际线上项目还需要考虑更多细节——比如强制使用 HTTPS、把 JWT 密钥放到环境变量、对输入做严格的校验(防止注入)、错误日志记录、密码重置流程等等。密码加密用的是 bcryptjs,但千万不要在代码里硬编码任何密钥或敏感信息。另外,如果打算用 session 替代 JWT,express-session 配合 connect-mongo 也是个成熟的方案。
从零到一搭一个认证系统,关键就是把这几个环节串起来:模型 → 注册 → 登录 → 中间件 → 保护路由。把每一步的代码写清楚,剩下的就是根据业务需求往上加功能了。
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
正版软件
正版软件
正版软件
正版软件
正版软件
1
2
3
7
8