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
相关产品推荐
相关产品推荐

