You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

iOS端Apple SignIn授权码验证返回invalid_grant错误排查求助

解决iOS端Apple SignIn授权码验证返回invalid_grant的问题

你遇到的这个问题我之前也踩过坑,结合你的描述,大概率是这几个地方没处理对,咱们一步步排查:

1. 移除多余的redirect_uri参数

这是原生iOS应用和Web应用验证授权码的核心区别:iOS端获取的授权码,在后端调用Apple Token API时不需要传redirect_uri

Web应用需要redirect_uri来匹配授权时的回调地址,但原生iOS应用是通过App ID直接授权的,没有这个回调环节。你现在把Web端的redirect_uri带过去,会导致Apple验证不通过,直接返回invalid_grant

修改你的请求体,去掉redirect_uri字段:

body = {
    'grant_type': 'authorization_code',
    'code': code,
    'client_secret': client_secret,
    'client_id': client_id  # 这里必须是iOS应用的Bundle ID
}

2. 确认Client Secret的生成完全匹配iOS应用

虽然你说重新生成了对应Bundle ID的Client Secret,但要仔细核对这几个细节:

  • JWT Payload参数正确:生成Client Secret的JWT必须包含以下字段:
    • iss:你的Apple开发者Team ID
    • aud:固定为https://appleid.apple.com
    • sub:iOS应用的Bundle ID(必须和你请求里的client_id一致)
    • exp:过期时间戳,必须设置为当前时间之后,但不能超过6个月(Apple的硬性要求)
  • 密钥关联正确的App ID:在Apple开发者后台,进入「Certificates, Identifiers & Profiles」→「Keys」→找到你的Sign In with Apple密钥,点击进入后确认「Sign In with Apple」选项下已经勾选了你的iOS App ID(不是Web用的Service ID)。
  • 签名算法必须是ES256:Apple只接受ES256算法签名的Client Secret,不能用RS256等其他算法。

3. 确保授权码是一次性使用的

Apple的授权码是一次性有效的,如果你在测试过程中重复使用同一个授权码,第二次调用就会返回invalid_grant。每次验证都要使用iOS端刚获取的新鲜授权码,并且只调用一次验证接口。

4. 匹配运行环境对应的Apple API

如果你是在iOS模拟器或TestFlight中使用测试Apple ID登录,必须调用沙箱环境的Token API,而不是生产环境的:

  • 生产环境URL:https://appleid.apple.com/auth/token
  • 沙箱环境URL:https://appleid.apple.com/auth/token(测试账号必须用这个,否则验证失败)

最后再核对一次请求头

你的请求头Content-Type: application/x-www-form-urlencoded是正确的,这个不用改。

按照上面的步骤调整后,应该就能正常验证授权码了。

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

火山引擎 最新活动