用Node.js和JWT实现用户认证系统

用Node.js和JWT实现用户认证系统

引言

JSON Web Token(JWT)是现代Web应用的常用认证机制,适合无状态认证。本文将指导你用Node.js实现一个完整的JWT认证系统,包括用户注册、登录和受保护路由。

环境搭建

安装依赖:npm install express jsonwebtoken bcryptjs

用户注册

使用bcrypt加密密码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
const express = require('express');
const bcrypt = require('bcryptjs');
const app = express();

app.use(express.json());

const users = [];

app.post('/register', async (req, res) => {
const { username, password } = req.body;
const hashedPassword = await bcrypt.hash(password, 10);
users.push({ username, password: hashedPassword });
res.status(201).send('用户注册成功');
});

用户登录与JWT生成

生成JWT令牌:

1
2
3
4
5
6
7
8
9
10
11
12
const jwt = require('jsonwebtoken');
const secret = 'your-secret-key';

app.post('/login', async (req, res) => {
const { username, password } = req.body;
const user = users.find(u => u.username === username);
if (!user || !(await bcrypt.compare(password, user.password))) {
return res.status(401).send('认证失败');
}
const token = jwt.sign({ username }, secret, { expiresIn: '1h' });
res.json({ token });
});

保护路由

使用中间件验证JWT:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
function authMiddleware(req, res, next) {
const token = req.header('Authorization')?.replace('Bearer ', '');
if (!token) return res.status(401).send('无令牌');
try {
const decoded = jwt.verify(token, secret);
req.user = decoded;
next();
} catch (err) {
res.status(401).send('无效令牌');
}
}

app.get('/protected', authMiddleware, (req, res) => {
res.send(`欢迎, ${req.user.username}`);
});

app.listen(8080);

安全注意事项

  • 保护密钥:将secret存储在环境变量中(如.env)。
  • 刷新令牌:实现刷新令牌机制延长会话。
  • HTTPS:始终使用HTTPS传输JWT。
  • 限制令牌有效期:设置合理expiresIn值。

总结

JWT认证系统为Node.js应用提供了轻量、安全的认证方案。通过bcrypt加密密码和中间件验证令牌,可以构建健壮的认证流程。希望本文的代码示例能帮助你快速实现用户认证!