Next.js中JWT解码失败求助:JWT.io可解析但代码报格式错误
Next.js POST接口解码JWT时报错
JsonWebTokenError: jwt malformed 在Next.js的POST接口中解码JWT Token时触发JsonWebTokenError: jwt malformed错误,但将该Token复制到jwt.io可正常解析,且相同解码逻辑在其他函数中能正常运行。相关代码、Token及错误栈如下:
相关代码
import { NextResponse } from "next/server"; import { redirect } from "next/navigation"; import jwt from "jsonwebtoken"; export async function POST(request) { const formData = await request.formData(); const paymentResponse = formData.get("paymentResponse"); const paymentToken = paymentResponse; console.log(paymentToken); const decodedToken = jwt.verify( paymentToken, "mysecret", { algorithms: ["HS256"] } ); console.log(decodedToken); }
待解码的Token内容
eyJsb2NhbGUiOm51bGwsImludm9pY2VObyI6IlRHNjQ2OCIsImNoYW5uZWxDb2RlIjoiQ0MiLCJyZXNwQ29kZSI6IjIwMDAiLCJyZXNwRGVzYyI6IlRyYW5zYWN0aW9uIGlzIGNvbXBsZXRlZCwgcGxlYXNlIGRvIHBheW1lbnQgaW5xdWlyeSByZXF1ZXN0IGZvciBmdWxsIHBheW1lbnQgaW5mb3JtYXRpb24uIn0=
错误栈
- error JsonWebTokenError: jwt malformed at module.exports [as verify] (webpack-internal:///(rsc)/./node_modules/jsonwebtoken/verify.js:71:21) at POST (webpack-internal:///(rsc)/./app/api/2c2p-response/frontend/route.js:31:78) at process.processTicksAndRejections (node:internal/process/task_queues:95:5) at async eval (webpack-internal:///(rsc)/./node_modules/next/dist/server/future/route-modules/app-route/module.js:254:37)
问题根源
你提供的"Token"并非标准JWT格式。标准JWT由header.payload.signature三段通过英文点号分隔组成,而当前内容仅为一段Base64编码的JSON对象(无签名部分)。jsonwebtoken库的verify方法要求传入完整格式的JWT,因此会判定为格式错误;而jwt.io支持单独解析Base64编码的payload内容,所以能正常显示。
解决方案
方案1:直接解码Base64内容
如果确认支付接口返回的就是这段Base64数据,无需使用jwt.verify,直接解码即可:
export async function POST(request) { const formData = await request.formData(); const paymentResponse = formData.get("paymentResponse"); // 处理Base64填充(确保长度是4的倍数) const paddedToken = paymentResponse.padEnd(paymentResponse.length + (4 - paymentResponse.length % 4) % 4, '='); // 解码Base64并转为JSON const decodedStr = Buffer.from(paddedToken, 'base64').toString('utf8'); const decodedToken = JSON.parse(decodedStr); console.log(decodedToken); }
方案2:检查Token完整性
如果预期应该是完整JWT,需要排查:
- 前端传递
paymentResponse时是否截断了内容,比如formData处理是否有误 - 支付接口返回的原始响应是否确实是完整JWT,是否在传输过程中丢失了签名段
内容的提问来源于stack exchange,提问作者Natamongkol
相关产品推荐
相关产品推荐

