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

DoorDash API集成遇JWT过期错误问题求助

DoorDash JWT过期错误排查:DoorDashAuthorizationError: The [exp] is in the past; the JWT is expired

我在集成DoorDash服务时遇到了一个诡异问题:单独生成JWT时每次都能得到有效令牌,但调用官方SDK的createDelivery接口时,始终返回DoorDashAuthorizationError: The [exp] is in the past; the JWT is expired错误,已严格遵循官方文档步骤操作,仍无法解决。

相关代码

JWT生成代码

const jwt = require('jsonwebtoken')

const accessKey = {
    "developer_id": "DEV",
    "key_id": "KEY",
    "signing_secret": "SECRET"
}

const data = {
    aud: 'doordash',
    iss: accessKey.developer_id,
    kid: accessKey.key_id,
    exp: Math.floor(Date.now() / 1000 + 60),
    iat: Math.floor(Date.now() / 1000),
}

const headers = { algorithm: 'HS256', header: { 'dd-ver': 'DD-JWT-V1' } }  

const token = jwt.sign(
    data,
    Buffer.from(accessKey.signing_secret, 'base64'),   
    headers,
)

console.log(token)

创建配送订单代码

const DoorDashClient = require('@doordash/sdk')

const client = new DoorDashClient.DoorDashClient({
    developer_id: "DEV",
    key_id: "KEY",
    signing_secret: "SECRET"
  })

const response = client
  .createDelivery({
    external_delivery_id: 'D-12345',
    pickup_address: '1000 4th Ave, Seattle, WA, 98104',
    pickup_phone_number: '+1(650)5555555',
    dropoff_address: '1201 3rd Ave, Seattle, WA, 98101',
    dropoff_phone_number: '+1(650)5555555',
  })
  .then(response => {
    console.log(response.data)
  })
  .catch(err => {
    console.log(err)
  })

排查方向及解决方案

  1. 服务器时间同步问题
    DoorDash服务器会严格校验JWT的时间戳,若你的服务器本地时间与UTC时间偏差超过1分钟,就会触发过期错误。
  • 用date -u(Linux)或Get-Date -Utc(Windows)查看服务器UTC时间,对比标准UTC时间确认偏差。
  • 配置服务器NTP服务自动同步时间,确保时间准确性。
  1. SDK内部JWT生成逻辑冲突
    官方SDK会自动生成JWT,可能存在版本bug或配置冲突:
  • 执行npm update @doordash/sdk升级到最新版本,旧版本可能存在JWT生成逻辑问题。
  • 核对SDK初始化参数与手动生成JWT时的参数,确保developer_id、key_id、signing_secret完全一致,无拼写错误或空格。
  • 绕过SDK,用手动生成的JWT直接调用API测试:
    const axios = require('axios');
    const token = // 手动生成JWT的代码
    
    axios.post('https://openapi.doordash.com/drive/v2/deliveries', {
      external_delivery_id: 'D-12345',
      pickup_address: '1000 4th Ave, Seattle, WA, 98104',
      pickup_phone_number: '+1(650)5555555',
      dropoff_address: '1201 3rd Ave, Seattle, WA, 98101',
      dropoff_phone_number: '+1(650)5555555',
    }, {
      headers: {
        'Authorization': `Bearer ${token}`,
        'Content-Type': 'application/json'
      }
    })
    .then(res => console.log(res.data))
    .catch(err => console.log(err.response.data));
    
    若此请求成功,说明SDK内部存在问题,可提交issue或查看官方文档的SDK更新日志。
  1. JWT时间戳计算验证
    解码生成的JWT,确认exp和iat的实际值是否符合预期:
const decoded = jwt.verify(token, Buffer.from(accessKey.signing_secret, 'base64'), { algorithms: ['HS256'] });
console.log('exp:', decoded.exp, 'iat:', decoded.iat, '当前时间:', Math.floor(Date.now()/1000));

检查exp是否确实比当前时间大60秒左右,排除计算溢出或逻辑错误。

  1. 签名密钥的Base64处理问题
    若你的signing_secret本身是明文而非Base64编码,Buffer.from(accessKey.signing_secret, 'base64')会生成错误密钥,可能导致校验异常(错误提示可能间接显示为过期):
  • 尝试去掉Buffer.from,直接用明文密钥生成JWT:
    const token = jwt.sign(
        data,
        accessKey.signing_secret,   
        headers,
    )
    
    同时确认SDK初始化时的signing_secret是否需要同样的处理,部分版本SDK会自动处理Base64解码。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 11:57:45