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

Express POST接口返回重复JWT问题:如何无超时确保测试通过

问题根源

jsonwebtoken库的sign方法默认会自动添加秒级精度的iat(签发时间)字段到JWT的payload中。当两个请求在同一秒内发起时,生成的payload完全一致,加上使用相同的密钥签名,最终输出的JWT自然完全相同,这就是并发请求时测试失败的原因。

解决方案

只要确保每次生成JWT时的payload包含唯一标识,就能保证每次返回的Token不同,以下是两种常用实现方式:

方案1:添加毫秒级时间戳或唯一ID到payload

方式A:使用毫秒级时间戳替代默认秒级iat

修改Express路由代码,手动在payload中加入毫秒级时间戳(Date.now()),替代默认的秒级iat:

const express = require('express')
const { sign } = require('jsonwebtoken')

const app = express()

app.post('/jwt', (_, response) => {
  const payload = { 
    data: { email: 'example@example.com' },
    iat: Date.now() // 毫秒级时间戳,确保同一秒内的请求payload不同
  }
  const jwt = sign(payload, 'secret')

  response.json({ jwt })
})

module.exports = app

方式B:添加标准JWT唯一ID(jti字段)

借助uuid库生成全局唯一ID作为jti字段(符合JWT标准规范):

  1. 先安装依赖:
npm install uuid
  1. 修改路由代码:
const express = require('express')
const { sign } = require('jsonwebtoken')
const { v4: uuidv4 } = require('uuid')

const app = express()

app.post('/jwt', (_, response) => {
  const payload = { 
    data: { email: 'example@example.com' },
    jti: uuidv4() // 每次请求生成唯一ID
  }
  const jwt = sign(payload, 'secret')

  response.json({ jwt })
})

module.exports = app

方案2:关闭自动时间戳,自定义唯一标识

通过sign方法的noTimestamp选项关闭自动添加的秒级iat,然后手动加入自定义的唯一内容:

const express = require('express')
const { sign } = require('jsonwebtoken')

const app = express()

app.post('/jwt', (_, response) => {
  const payload = { 
    data: { email: 'example@example.com' },
    requestId: Date.now() // 自定义唯一标识,也可使用uuid
  }
  const jwt = sign(payload, 'secret', { noTimestamp: true })

  response.json({ jwt })
})

module.exports = app
原理说明

JWT的生成基于payload内容、密钥和算法。只要每次的payload包含唯一信息,即使请求并发执行,签名后的结果也会完全不同,从而保证测试用例无论请求是否同时发起都能通过。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 06:10:31