如何利用用户登录生成的JWT Token认证员工路由?
为Express员工路由添加JWT认证的实现方案
1. 编写JWT验证中间件
先实现一个通用中间件来校验请求中的JWT令牌,这是路由保护的核心。确保已安装jsonwebtoken依赖(执行npm install jsonwebtoken)。
const jwt = require('jsonwebtoken'); // JWT认证中间件 const authenticateToken = (req, res, next) => { // 从Authorization头提取令牌(格式:Bearer <token>) const authHeader = req.headers['authorization']; const token = authHeader?.split(' ')[1]; // 无令牌直接返回401未授权 if (!token) { return res.status(401).json({ error: '访问令牌缺失,请先登录' }); } // 验证令牌有效性 jwt.verify(token, process.env.JWT_SECRET, (err, decodedUser) => { // 令牌无效/过期返回403禁止访问 if (err) { return res.status(403).json({ error: '令牌无效或已过期' }); } // 将解析后的用户信息挂载到req对象,供后续路由使用 req.user = decodedUser; next(); // 放行到目标路由 }); }; module.exports = authenticateToken;
2. 将中间件应用到员工路由
把上面的中间件引入到员工路由文件中,直接添加到需要保护的路由处理函数之前即可。
const express = require('express'); const router = express.Router(); const authenticateToken = require('../middleware/authenticateToken'); // 替换为你的中间件实际路径 // 受保护的创建员工POST接口 router.post('/employees', authenticateToken, (req, res) => { // 这里编写创建员工的业务逻辑 // 可通过req.user获取当前登录用户的信息(比如用户ID、角色) const employeeData = req.body; // 示例:模拟保存到数据库的操作 // await Employee.create(employeeData); res.status(201).json({ message: '员工创建成功', employee: employeeData, operatedBy: req.user.username // 展示当前操作的用户 }); }); module.exports = router;
3. 关键注意事项
- 环境变量管理JWT密钥:不要硬编码JWT_SECRET,使用
dotenv(执行npm install dotenv)管理。在项目根目录创建.env文件,写入JWT_SECRET=你的强密钥,并在项目入口文件添加require('dotenv').config();。 - 登录时生成有效令牌:确保登录接口生成令牌时配置合理的过期时间,示例如下:
// 登录接口示例 router.post('/login', async (req, res) => { // 验证用户账号密码的逻辑(此处省略) const validUser = { id: 123, username: 'admin', role: 'admin' }; // 生成1小时有效期的令牌 const accessToken = jwt.sign(validUser, process.env.JWT_SECRET, { expiresIn: '1h' }); res.json({ accessToken }); }); - 角色权限扩展(可选):如果需要限制特定角色访问(比如仅管理员能创建员工),可以在中间件中添加角色校验:
之后把路由中的// 带角色校验的中间件 const authenticateAdmin = (req, res, next) => { authenticateToken(req, res, () => { if (req.user.role !== 'admin') { return res.status(403).json({ error: '无权限执行此操作' }); } next(); }); };authenticateToken替换为authenticateAdmin即可。
内容的提问来源于stack exchange,提问作者joe34
相关产品推荐
相关产品推荐

