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

Next.js与Spring Boot集成时JWT验证过期问题求助

Next.js中间件验证JWT始终提示“令牌已过期”的解决方案

核心问题排查

1. 密钥处理不一致(最可能的原因)

Spring Boot后端对密钥的处理是先做Base64解码,再生成HMAC密钥:

byte[] keyBytes = Decoders.BASE64.decode(SECRET_KEY);
return Keys.hmacShaKeyFor(keyBytes);

而你的Next.js代码直接对密钥字符串执行TextEncoder.encode,没有做Base64解码,导致前后端使用的签名密钥完全不一致。jose库会把签名验证失败的错误统一抛出为“令牌已过期”,掩盖了真实问题。

2. 错误捕获逻辑模糊

当前verifyAuth把所有JWT验证错误都归为“令牌已过期”,无法区分签名错误、格式错误等真实原因,给排查带来障碍。

3. 前后端时间不同步

你后端设置的JWT有效期是24分钟(1000 * 60 * 24),如果前后端服务器系统时间差超过这个时长,前端验证时会误判令牌已过期。


解决方案步骤

1. 修正Next.js的密钥处理逻辑

修改verifyAuth中的密钥生成代码,对后端传入的Base64格式密钥做解码,和后端逻辑对齐:

import { jwtVerify, JWTExpired, JWTInvalid } from 'jose';
import { USER_TOKEN, getJwtSecretKey } from '../constatns';

interface UserJwtPayload {
  jti: string;
  iat: number;
}

export class AuthError extends Error {}

export async function verifyAuth(req: NextRequest) {
  const token = req.cookies.get(USER_TOKEN)?.value;

  if (!token) throw new AuthError('Missing user token');

  try {
    // 对Base64格式的密钥解码,匹配后端逻辑
    const secretKey = Buffer.from(getJwtSecretKey(), 'base64');
    const verified = await jwtVerify(token, secretKey);
    return verified.payload as UserJwtPayload;
  } catch (err) {
    // 区分错误类型,定位真实问题
    if (err instanceof JWTExpired) {
      throw new AuthError('Your token has expired.');
    } else if (err instanceof JWTInvalid) {
      throw new AuthError('Invalid token signature.');
    } else {
      throw new AuthError('Authentication failed.');
    }
  }
}

2. 手动验证JWT有效性

用jwt.io工具解析后端生成的token:

  • 把token粘贴到Encoded输入框
  • 在Verify Signature区域输入后端的SECRET_KEY,并确认Base64编码选项开启
  • 检查exp字段的时间是否符合预期,以及签名是否能验证通过

3. 调整时间同步

  • 临时把后端JWT有效期延长至24小时(1000 * 60 * 60 * 24),测试是否还会触发过期提示
  • 确保前后端服务器的系统时间误差控制在5分钟以内

替代方案

如果上述方法仍无法解决,可以尝试:

  • 改用jsonwebtoken库替代jose,验证密钥逻辑是否一致:
    import jwt from 'jsonwebtoken';
    
    // 在verifyAuth中替换验证逻辑
    const verified = jwt.verify(token, Buffer.from(getJwtSecretKey(), 'base64'), { algorithms: ['HS256'] });
    
  • 在中间件和verifyAuth中添加日志,打印获取到的token内容、密钥解码后的值以及错误详情,帮助定位问题

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 01:13:59