使用Passport-jwt访问受保护路由返回Unauthorized错误求助
问题修复方案
你的代码里有两个关键问题导致认证失败:
1. 签名算法不匹配
你生成JWT时用的是对称加密算法HS256(基于字符串secret签名),但Passport-JWT配置里指定了algorithms: ['RS256']——RS256是非对称算法,需要RSA公钥/私钥对,和当前签名方式完全不兼容。
2. Token提取器未正确调用
ExtractJwt.fromAuthHeaderAsBearerToken是一个方法,必须加括号执行ExtractJwt.fromAuthHeaderAsBearerToken(),否则你传递的是函数本身,而非它返回的token提取逻辑,导致Passport无法从请求头中读取到Token。
修正后的完整代码
const express = require("express"); const passport = require('passport'); const jwt = require('jsonwebtoken'); const JWTStrategy = require('passport-jwt').Strategy; const ExtractJwt = require('passport-jwt').ExtractJwt; const secret = "s0m3$3Cret$h0lyC0d3&$"; const options = { // 修复:调用方法获取Token提取器 jwtFromRequest: ExtractJwt.fromAuthHeaderAsBearerToken(), secretOrKey: secret, // 修复:改用和签名一致的HS256算法 algorithms: ['HS256'] }; passport.use(new JWTStrategy(options, function(jwt_payload, done){ return done(null, {id: 'FAKE_ID'}); })); const app = new express(); // 必须初始化Passport,否则中间件无法生效 app.use(passport.initialize()); app.get('/authenticate', (req, res, next) => { const token = jwt.sign({sub:'FAKE_ID'}, secret, {expiresIn: 604800}); res.status(200).json({ success: true, message: 'Logged in successfully!', token: 'Bearer ' + token}); }) app.get('/protected', passport.authenticate('jwt', { session: false }), (req, res, next) => { res.status(200).json({ success: true, msg: "You are successfully authenticated to this route!"}); }); app.listen(3000, () => { console.log('App running at 3000') })
额外提示:别漏加app.use(passport.initialize()),这是很多人容易忽略的Passport初始化步骤,缺少它会导致认证中间件完全不工作。
内容的提问来源于stack exchange,提问作者Vassis
相关产品推荐
相关产品推荐

