生成的JWT Token提交至Apple服务器始终返回401未授权,求排查
排查App Store Server API JWT 401未授权问题
针对你提供的代码,以下是几个大概率导致401的错误点:
密钥使用混乱
代码里同时定义了$priv_key(HEREDOC内的密钥字符串)和从AuthKey.pem加载的$pem_private_key,但最后调用JWT::encode时用的是$priv_key。如果你的有效密钥是AuthKey.pem文件,那应该把JWT::encode的第二个参数换成$pem_private_key;如果密钥是HEREDOC里的内容,就删掉文件加载的冗余代码,避免混淆。Audience参数错误
你代码里的aud设为appstoreconnect-v1,这是App Store Connect API的受众标识,而非App Store Server API的。正确的aud需要区分环境:- 沙盒环境:
https://api.storekit-sandbox.itunes.apple.com - 生产环境:
https://api.storekit.itunes.apple.com
- 沙盒环境:
密钥权限未配置
确认你在App Store Connect生成的AuthKey已经开启了「App Store Server API」的权限。如果密钥没有对应权限,哪怕JWT签名正确,Apple也会返回401。Bundle ID匹配问题
检查payload里的bid值是否和App Store Connect中App的Bundle ID完全一致,大小写、拼写、特殊字符都不能出错。服务器时间偏差
Apple对JWT的时间参数(iat/exp)校验严格,若你的服务器系统时间与UTC时间偏差超过5分钟,会被判定为无效Token。确保服务器时间同步正常。JWT库参数或密钥格式问题
- 确认使用的JWT库(比如firebase/php-jwt)参数顺序正确,
JWT::encode的第四个参数是keyId、第五个是headers,和你代码里的调用一致。 - 检查密钥格式:不管是HEREDOC还是
AuthKey.pem文件,密钥内容不能有多余缩进、空格,开头结尾的-----BEGIN PRIVATE KEY-----和-----END PRIVATE KEY-----必须完整且正确。
- 确认使用的JWT库(比如firebase/php-jwt)参数顺序正确,
内容的提问来源于stack exchange,提问作者cesarcarlos
相关产品推荐
相关产品推荐

