DoorDash API集成遇JWT过期错误问题求助
我在集成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) })
排查方向及解决方案
- 服务器时间同步问题
DoorDash服务器会严格校验JWT的时间戳,若你的服务器本地时间与UTC时间偏差超过1分钟,就会触发过期错误。
- 用
date -u(Linux)或Get-Date -Utc(Windows)查看服务器UTC时间,对比标准UTC时间确认偏差。 - 配置服务器NTP服务自动同步时间,确保时间准确性。
- SDK内部JWT生成逻辑冲突
官方SDK会自动生成JWT,可能存在版本bug或配置冲突:
- 执行
npm update @doordash/sdk升级到最新版本,旧版本可能存在JWT生成逻辑问题。 - 核对SDK初始化参数与手动生成JWT时的参数,确保
developer_id、key_id、signing_secret完全一致,无拼写错误或空格。 - 绕过SDK,用手动生成的JWT直接调用API测试:
若此请求成功,说明SDK内部存在问题,可提交issue或查看官方文档的SDK更新日志。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));
- 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秒左右,排除计算溢出或逻辑错误。
- 签名密钥的Base64处理问题
若你的signing_secret本身是明文而非Base64编码,Buffer.from(accessKey.signing_secret, 'base64')会生成错误密钥,可能导致校验异常(错误提示可能间接显示为过期):
- 尝试去掉
Buffer.from,直接用明文密钥生成JWT:
同时确认SDK初始化时的const token = jwt.sign( data, accessKey.signing_secret, headers, )signing_secret是否需要同样的处理,部分版本SDK会自动处理Base64解码。
内容的提问来源于stack exchange,提问作者Justin Eastin
相关产品推荐
相关产品推荐

