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

在Firebase实现Apple Sign-In令牌吊销流程时Axios请求报400错误

排查Apple Sign-In获取Refresh Token时的400错误

以下是针对你的问题的具体排查和修复方向:

1. 优先获取Apple返回的具体错误详情

你的catch块仅记录了error对象,但Apple的/auth/token接口返回400时,会在error.response.data中返回具体错误码(比如invalid_grant、invalid_client),这是定位问题的核心依据。修改catch代码:

.catch((error) => {
  if (error.response) {
    functions.logger.log('Apple API错误详情:', error.response.data);
    response.status(400).send(error.response.data);
  } else {
    functions.logger.log('请求错误:', error.message);
    response.status(500).send(error.message);
  }
})

先拿到具体错误码,再针对性处理。

2. 检查client_secret生成的合规性

makeJWT()生成的JWT必须严格符合Apple的要求:

  • 签名算法:必须使用ES256(椭圆曲线签名),不能用RS256或其他算法。
  • JWT payload参数:
    • iss:你的Apple Developer Team ID(不是bundle ID)。
    • iat:当前秒级时间戳。
    • exp:过期时间戳,最长不能超过生成时间后的6个月(15777000秒)。
    • aud:固定为https://appleid.apple.com。
    • sub:你的应用bundle ID(需和请求中的client_id完全一致)。
  • 签名密钥:必须使用Apple开发者后台生成的「Sign in with Apple」专用密钥(下载的.p8文件),密钥ID要与JWT header里的kid字段对应。

只要makeJWT()未满足以上任意一点,都会返回invalid_client错误。

3. 确认authorization_code的有效性

  • Apple的authorization_code只能使用一次,如果之前已用该code请求过/auth/token,再次请求会返回invalid_grant错误。确保传递的是最新获取、未被使用过的code。
  • 检查code是否被意外截断或修改:你的code格式符合预期,但要确保传递给Cloud Function时未被URL编码破坏(比如请求参数中的code是否完整,无转义错误)。

4. 核对请求参数与头部细节

  • client_id必须严格匹配应用的bundle ID,注意大小写和拼写(比如com.yourcompany.app不能写错)。
  • 确认qs.stringify(data)是否正确处理所有参数,比如client_secret中的特殊字符是否被正确编码。
  • 请求头部的Content-Type必须严格设置为application/x-www-form-urlencoded,不能有多余空格或拼写错误。

5. 其他潜在问题

  • 如果你的应用是iOS原生+Web的组合,要确认client_id对应正确的身份类型(原生应用用bundle ID,Web应用用服务ID)。
  • 检查Cloud Function的网络权限:确保Firebase Cloud Functions可以访问外部网络(默认允许,但如果配置了VPC网络可能需要调整出站规则)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 23:40:48