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

如何在Node.js的Passport-JWT策略中返回JSON格式未授权响应

自定义Passport-JWT未认证时的JSON响应

要解决这个问题,核心是利用Passport authenticate方法的自定义回调功能——默认的失败响应是文本格式,我们可以通过回调完全接管认证成功/失败后的逻辑,返回自定义的JSON响应。

步骤1:修改路由的认证中间件

把原来直接使用passport.authenticate作为中间件的写法,改成传入自定义回调的形式:

router.get('/users', (req, res, next) => {
  passport.authenticate('jwt', { session: false }, (err, user, info) => {
    // 处理服务器内部错误(比如数据库查询异常)
    if (err) {
      return res.status(500).json({
        success: false,
        message: '服务器内部错误'
      });
    }
    // 未通过认证(无令牌/令牌无效/对应用户不存在)
    if (!user) {
      return res.status(401).json({
        success: false,
        message: '未授权,请提供有效的JWT令牌',
        // 可选:带上Passport返回的具体错误信息,帮助客户端排查问题
        error: info?.message || '认证失败'
      });
    }
    // 认证成功:把用户对象挂载到req上,继续执行控制器逻辑
    req.user = user;
    next();
  })(req, res, next);
}, UserController.get);

步骤2:理解回调参数的作用

  • err:当认证过程中出现服务器端错误时会被赋值(比如数据库查询失败)
  • user:认证成功时返回的用户对象,未通过认证时为false
  • info:包含Passport内置的认证失败提示(比如"jwt expired"令牌过期、"No auth token"无令牌等),可以选择性地加到响应里

注意事项

  • 你现有的Passport-JWT策略代码不需要做任何修改,保持原样即可
  • 这种路由级的自定义方式可以针对不同接口返回不同格式的响应,非常灵活;如果想全局统一处理所有Passport认证失败的情况,也可以结合Express的错误处理中间件实现,但路由级的自定义更直接

这样修改后,当请求没有携带JWT令牌或者令牌无效时,接口就会返回你定义的JSON格式响应,而不是默认的文本"Unauthorized"了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 08:40:43