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

Sign in With Apple出现'invalid_grant'错误:授权码已被使用

Apple授权码兑换Token时提示"The code has already been used"问题排查与解决

我在使用Apple ID授权码兑换访问令牌时,反复遇到**"The code has already been used"错误,但确认授权码是在5分钟有效期内提交的。5分钟后还会收到"The code has expired or has been revoked"**错误。我的PHP请求代码如下:

$data = [
    'client_id' => $clientId, // app id?
    'client_secret' => $client_secret,
    'grant_type' => 'authorization_code',
    'code' => $code, //from request
    'redirect_uri' => $uri,
]; 
curl_setopt($ch, CURLOPT_URL, "https://appleid.apple.com/auth/token");
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($data));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

$server_output = curl_exec($ch); //=> '{"error":"invalid_grant","error_description":"The code has already been used."}'

可能的原因及解决方法:

  • 避免重复提交同一授权码:Apple授权码是一次性凭证,只要被提交过(哪怕请求超时未收到响应)就会失效。检查代码是否存在自动重试逻辑、前端是否重复触发请求,或者日志中是否有同一code被多次发送的记录。
  • 校验client_id与redirect_uri的准确性:
    • client_id必须是开发者后台配置的Service ID(而非App ID,App ID仅适用于移动端App内授权场景)。
    • redirect_uri必须与Service ID配置的重定向URI完全匹配,包括大小写、路径结尾的斜杠等细节,不能有任何偏差。
  • 验证client_secret的有效性:
    • 确认client_secret是用正确的开发者密钥(Key ID + Team ID)生成的JWT。
    • JWT的exp声明不能超过当前时间,且有效期不超过6个月。
    • JWT的aud字段必须为https://appleid.apple.com,iss字段为你的Team ID。
  • 排查网络异常:如果存在代理、负载均衡或网络波动,可能导致请求被重复转发。添加请求日志,记录每次提交的code、时间和响应状态,确认是否存在重复请求。
  • 确保授权码获取流程合规:授权码必须直接来自Apple的授权回调,不能被修改、存储后重复使用,也不能跨环境(测试/生产)复用同一code。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 08:40:42