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
相关产品推荐
相关产品推荐

