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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 22:43:17