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
相关产品推荐
相关产品推荐

