You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何利用用户登录生成的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 08:10:21