PHP实现Sign In with Apple重定向时form_post模式无法获取code参数如何解决
排查方向及解决方案
校验苹果开发者后台重定向URI配置
必须和授权URL中redirect_uri参数完全一致,包括协议头(线上必须为HTTPS,本地测试除外)、域名、路径、末尾斜杠,任意不一致都会导致苹果不返回任何参数。排查中间层是否丢弃POST请求体
苹果使用POST请求提交参数到你的重定向地址,检查你服务端的Nginx/Apache配置、CDN规则、WAF防护策略是否存在以下行为:
- 收到POST请求后自动301/302重定向(比如强制跳转到带www的域名、补全末尾斜杠),重定向过程中会丢弃POST请求体
- 拦截了苹果IP段的请求,导致请求根本没有到达
apple_auth_redirect.php
你可以在apple_auth_redirect.php最顶部加日志排查是否真的收到请求:
<?php // 把所有请求信息写入日志,先确认参数是否真的没到后端 file_put_contents(__DIR__.'/apple_request_log.txt', var_export([ 'GET' => $_GET, 'POST' => $_POST, 'HEADERS' => getallheaders() ], true).PHP_EOL, FILE_APPEND); // 原有逻辑 if (isset($_POST['code'])) { $code = urlencode($_POST['code']); header("Location: intent://callback?apple_id_token=".$code); } else { echo "no_code"; }
- 强制指定
response_mode参数
部分版本的patrickbussmann/oauth2-apple库可能会覆盖默认的响应模式,生成授权URL时可以手动强制指定:
function get_apple_signin_url() { $options = [ 'scope' => ['email'], 'response_mode' => 'form_post' ]; $authUrl = $this->provider->getAuthorizationUrl($options); $_SESSION['oauth2state'] = $this->provider->getState(); return '{"url": "'.$authUrl.'"}'; }
- 注意授权复用的参数规则
如果用户已经完成过一次授权且同意了邮箱权限,后续授权时苹果不会再返回email和name字段,但code参数一定会返回,如果你仅缺失邮箱信息属于正常行为,可通过后端解码id_token获取用户唯一标识关联已有账号。
内容的提问来源于stack exchange,提问作者ecorradini
相关产品推荐
相关产品推荐

