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

Node.js Passport-JWT 401未授权问题:登录获token后无法访问用户资料

解决Passport-JWT登录后访问接口401未授权问题

我来帮你排查这个401的问题,咱们从几个常见的核心点入手:

1. JWT Scheme大小写不匹配

你的passport.js里配置的Token提取规则是:

opts.jwtFromRequest = ExtractJwt.fromAuthHeaderWithScheme('jwt');

但在users.js的登录接口返回Token时,前缀用的是大写:

token: "JWT " + token

Passport-JWT的Scheme是严格区分大小写的,这里大小写不匹配会导致无法正确从请求头中提取Token,直接触发401。

解决方案:统一两边的Scheme大小写,比如把passport配置改成大写:

opts.jwtFromRequest = ExtractJwt.fromAuthHeaderWithScheme('JWT');

或者把返回Token的前缀改成小写:

token: "jwt " + token

保持两边完全一致即可。

2. JWT Payload中的ID字段不匹配

你生成Token时用的是user.toJSON(),而Mongoose模型的默认ID字段是_id,但在passport.js里你用jwt_payload.id来查询用户:

User.getUserById(jwt_payload.id, (err, user) => { ... })

这时候jwt_payload.id是不存在的,自然查不到用户,返回401。

解决方案:两种方式二选一即可:

  • 生成Token时明确指定ID字段:
    const token = jwt.sign(
      { id: user._id, username: user.username, email: user.email },
      config.secret,
      { expiresIn: 3600 }
    );
    
  • 或者在passport中使用_id查询:
    User.getUserById(jwt_payload._id, (err, user) => { ... })
    

3. 确认请求头的Token携带正确

在Postman访问/profile接口时,必须在请求头里添加Authorization字段,值为登录返回的完整Token(比如JWT eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...)。

重点检查:

  • 有没有把Authorization拼写错误(比如写成Auth、authorization等)
  • Token有没有完整复制,有没有多余的空格或换行符

4. 确认Passport已正确初始化

在你的主应用文件(比如app.js)里,必须确保完成Passport的初始化和配置加载:

const passport = require('passport');

// 初始化Passport中间件
app.use(passport.initialize());
// 加载Passport-JWT配置
require('./config/passport')(passport);

如果跳过这一步,Passport的认证逻辑根本不会生效,接口会直接返回401。

5. 检查Token是否过期

你生成Token时设置的过期时间是3600(1小时),如果测试时超过1小时,Token就会失效。可以临时把过期时间改长来测试:

const token = jwt.sign(user.toJSON(), config.secret, {
  expiresIn: 604800 // 一周
});

先试试上面的几个方案,应该能解决你的401问题!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:14:36