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

如何使用node-jsonwebtoken正确签名Apple App Store Server API所需JWT

你遇到的报错和401问题核心是两个原因:node-jsonwebtoken库的参数传递顺序错误、苹果API要求的签名算法配置错误。

错误根因说明

  1. jwt.sign()方法的参数顺序错误:该方法的标准传参顺序为payload(JWT声明内容)、签名密钥、配置项、回调函数,你之前把头部当做payload、声明当做配置项传入,自然会触发iss不能出现在options中的报错——iss属于JWT的标准声明字段,只能放在payload里,不能放在库的配置项根节点。
  2. 签名算法配置错误:苹果App Store Server API要求必须使用ES256算法签名,你当前配置的HS256不符合要求,这是你调整参数后依然返回401的核心原因。

正确实现代码

1. 定义JWT声明(Payload)

const jwtClaims = {
  iss: issuerID, // App Store Connect中获取的发行者ID
  aud: "appstoreconnect-v1", // 苹果官方固定的受众值
  iat: Math.floor(Date.now() / 1000), // 签发时间戳,单位为秒
  exp: Math.floor(Date.now() / 1000) + 3600, // 过期时间,最长不能超过60分钟
  bid: "你的应用Bundle ID" // 苹果要求的应用包ID字段
}

2. 定义JWT头部

const jwtHeaders = {
  alg: "ES256", // 必须使用苹果要求的ES256算法
  typ: "JWT",
  kid: kid // App Store Connect中生成私钥时对应的Key ID
}

3. 调用签名方法

// yourES256PrivateKey为从App Store Connect下载的.p8格式私钥内容
jwt.sign(jwtClaims, yourES256PrivateKey, {
  header: jwtHeaders,
  noTimestamp: true // 关闭库自动生成iat的逻辑,使用我们自定义的iat值
}, (err, token) => {
  if (err) {
    // 处理签名错误
    throw err
  }
  // 生成的token即可用于请求苹果App Store Server API
})

401问题补充排查点

如果调整后仍然返回401,可逐一核对以下配置:

  • 确认使用的私钥是从App Store Connect下载的、对应App的ES256格式私钥,没有被篡改
  • 确认iss、kid、bid字段值和你在App Store Console的配置完全一致
  • 确认exp字段的有效期不超过60分钟,苹果会直接拒绝有效期过长的令牌

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 10:06:03