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

如何在Express客户端(Pug)为请求头添加JWT以配合express-jwt鉴权

如何在Pug客户端为页面请求添加JWT请求头适配express-jwt

普通的<a>标签跳转属于浏览器原生GET请求,无法直接自定义请求头。针对你的场景,有几种可行方案:

方法一:使用Cookie存储JWT(推荐)

这是最符合浏览器行为、实现简单且安全性较高的方案。浏览器会自动在每次请求中携带Cookie,无需手动处理请求头。

步骤1:登录成功后服务器设置Cookie

在登录接口中,生成JWT后将其设置为HttpOnly类型的Cookie:

// 登录成功后生成token的逻辑
const token = jwt.sign({ userId: user.id }, process.env.JWT_SECRET, { 
  algorithm: 'sha512',
  expiresIn: '1d'
});

// 设置Cookie
res.cookie('jwt', token, {
  httpOnly: true, // 禁止前端JS读取,防范XSS攻击
  secure: process.env.NODE_ENV === 'production', // 生产环境仅通过HTTPS传输
  maxAge: 24 * 60 * 60 * 1000 // Cookie有效期1天
});

步骤2:修改express-jwt配置从Cookie提取令牌

调整你的auth中间件,指定从Cookie中获取JWT:

const auth = jwt({
  secret: process.env.JWT_SECRET,
  algorithms: ['sha512'],
  userProperty: 'payload',
  getToken: (req) => {
    return req.cookies.jwt; // 对应Cookie的名称
  }
});

完成以上配置后,你的<a(href='/reqpage')>跳转请求会自动携带Cookie,express-jwt就能正常验证令牌并将用户信息附加到req.payload中。

方法二:通过JavaScript拦截a标签请求自定义请求头

如果必须通过Authorization头传递JWT,可以拦截a标签的点击事件,改用fetch发起带请求头的请求,再处理页面渲染。

步骤1:修改Pug模板给a标签添加标识类

a(href='/reqpage', class='auth-protected-link') 访问权限页面

步骤2:编写客户端JS拦截请求

// 监听所有带auth-protected-link类的a标签点击
document.querySelectorAll('.auth-protected-link').forEach(link => {
  link.addEventListener('click', async (e) => {
    e.preventDefault(); // 阻止原生跳转行为
    const targetUrl = link.getAttribute('href');
    const token = localStorage.getItem('jwt'); // 假设JWT存在localStorage中

    try {
      const response = await fetch(targetUrl, {
        method: 'GET',
        headers: {
          'Authorization': `Bearer ${token}` // 添加JWT到Authorization头
        }
      });

      if (response.ok) {
        // 加载返回的页面HTML并替换当前页面内容
        const pageHtml = await response.text();
        document.documentElement.innerHTML = pageHtml;
        // 更新浏览器历史记录,保证前进后退正常
        history.pushState({}, '', targetUrl);
      } else {
        // 权限验证失败时跳转到登录页
        window.location.href = '/login';
      }
    } catch (err) {
      console.error('请求失败:', err);
      window.location.href = '/login';
    }
  });
});

这种方式需要手动处理页面渲染和历史记录,体验不如原生跳转流畅,适合特殊场景使用。

方法三:通过URL查询参数传递JWT(不推荐)

可以将JWT作为查询参数附加到URL中,但这种方式存在安全风险(令牌会暴露在URL、浏览器历史、服务器日志中),仅用于测试或非敏感场景:

步骤1:修改Pug模板拼接查询参数

- const token = localStorage.getItem('jwt');
a(href=`/reqpage?token=${token}`) 访问权限页面

步骤2:修改express-jwt配置从查询参数提取令牌

const auth = jwt({
  secret: process.env.JWT_SECRET,
  algorithms: ['sha512'],
  userProperty: 'payload',
  getToken: (req) => {
    return req.query.token;
  }
});

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 05:39:24