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

Spring Boot生成JWT后Next.js端签名验证失败问题排查

问题原因及解决方案

问题出在两端密钥的处理方式不一致:

  • Java Spring Boot端:你将Base64编码的密钥字符串通过Decoders.BASE64.decode(secretKey)解码成原始字节数组,再生成HMAC密钥。
  • Next.js端:你直接把Base64编码的密钥字符串用TextEncoder().encode()转成UTF-8字节,这相当于把Base64字符串本身当成了密钥,而非解码后的原始密钥,自然导致签名验证失败。

修复Next.js端的验证代码

使用jose库的base64decode方法先解码Base64密钥,再用于验证:

import { jwtVerify, base64decode } from 'jose'
import { cookies } from 'next/headers'

export async function verifyAuth() {
  const token = cookies().get('user-token')

  if (!token) {
    return null
  }

  const jwtSecretKey = getJwtSecretKey()
  // 先解码Base64密钥,得到原始字节
  const secretKeyBytes = base64decode(jwtSecretKey)

  const { payload } = await jwtVerify(token.value, secretKeyBytes)

  return payload as JwtPayload
}

额外检查项

  • 确认.env中的密钥和Java端使用的Base64字符串完全一致,没有多余的空格、换行符或引号。
  • 确保两端使用的签名算法都是HS256(你的代码中已经明确指定,这部分没问题)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 20:32:06