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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 14:30:42