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

如何在express-JWT中获取授权令牌?JWT验证路由报错求助

问题:express-jwt中间件导致/api/users路由报错,及如何获取授权令牌

我在学习JWT授权时编写了如下代码,用于配置express-jwt中间件和登录接口:

app.use(expressJwt({secret: 'mojos', algorithms: ['HS256']}).unless({path: ['/api/auth']}));
app.post('/api/auth', function(req, res) {
  const body = req.body;
  const user = USERS.find(user => user.username == body.username);
  if(!user || body.password != 'todo') return res.sendStatus(401);
  var token = jwt.sign({userID: user.id}, 'mojos', {expiresIn: '2h'});
  res.send({token});
});

但访问/api/users路由(代码如下)时出现错误:

app.get('/api/users', function (req, res) {
  res.type("json");
  res.send(getUsers(1));
});

注释掉app.use(expressJwt(...))这一行后功能正常,但这样就失去了JWT授权的作用。请问问题出在哪?另外,如何在express-JWT中获取授权令牌?


问题原因分析

你遇到的错误本质是访问/api/users时没有提供有效的JWT令牌,导致express-jwt中间件验证失败并返回错误。

express-jwt中间件的作用是对除了/api/auth之外的所有路由进行JWT令牌验证:

  • 当请求没有携带令牌、令牌格式错误、令牌过期或者签名不匹配时,中间件会直接返回401(未授权)错误。
  • 注释掉中间件后,跳过了验证步骤,所以/api/users能正常返回内容,但这不符合授权的需求。

解决方案

要让/api/users正常工作,你需要按以下步骤操作:

  1. 先获取有效的JWT令牌:
    向/api/auth发送POST请求,请求体里带上正确的username(需要匹配USERS数组中的用户)和password: 'todo',接口会返回一个包含token的响应。
  2. 访问/api/users时携带令牌:
    在请求头中添加Authorization字段,格式为:Bearer <你获取到的token>。比如:
    Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
    
    这样express-jwt中间件就能成功验证令牌,允许请求访问/api/users路由。

如何在express-JWT中获取授权令牌及解码信息

  1. 获取解码后的令牌信息:
    当express-jwt验证令牌成功后,会自动将解码后的令牌数据挂载到req.user对象上。比如你在签名时存入了userID: user.id,那么在/api/users的路由处理函数里可以直接访问:
    app.get('/api/users', function (req, res) {
      console.log("当前用户ID:", req.user.userID); // 输出签名时存入的userID
      res.type("json");
      res.send(getUsers(1));
    });
    
  2. 获取原始的令牌字符串:
    如果需要拿到原始的令牌字符串,可以从请求头中提取:
    const token = req.headers.authorization?.split(' ')[1];
    // 注意:这里要做非空判断,避免没有Authorization头时出现错误
    

内容的提问来源于stack exchange,提问作者Mihaly

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 08:17:20