用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
加密密码和中间件验证令牌,可以构建健壮的认证流程。希望本文的代码示例能帮助你快速实现用户认证!