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

Laravel Socialite集成Apple SSO时遇invalid_grant错误求助

解决Laravel Socialite Apple登录返回invalid_grant错误

以下是针对你遇到的invalid_grant错误的排查和解决步骤:

1. 确保authorization code是一次性且未过期

Apple的authorization code只能使用一次,且有效期仅5分钟。如果调试时重复复用旧code,会直接触发该错误。请确保每次测试都从Apple登录弹窗获取全新的code,不要使用已请求过的旧值。

2. 严格匹配redirect_uri

JS前端初始化Apple登录时的redirectURI必须和Laravel配置文件中services.apple.redirect_uri完全一致:

  • 协议(http/https)必须统一
  • 域名、路径完全相同,不能有多余斜杠或大小写差异
  • 示例:前端JS代码中需写redirectURI: "https://app.mywebsite.com/auth/apple/callback",与后端配置完全匹配

3. 验证client_secret的生成正确性

即使你用了两种生成方式,也需确认以下细节:

  • 生成时使用的client_id必须是Apple开发者后台的Service ID(你当前的com.mywebsite.service-id类型正确,但要确保生成secret时用的就是这个值)
  • 确保.p8密钥文件是从Apple开发者后台正确下载的,team_id和key_id与后台信息完全匹配
  • 签名算法必须为ES256,有效期不超过6个月

可以用以下Laravel代码重新生成client_secret,替换现有配置试试:

use Firebase\JWT\JWT;

// 先安装依赖:composer require firebase/php-jwt
$privateKey = file_get_contents(storage_path('app/apple-auth/AppleAuthKey_XXXXXX.p8')); // 替换为你的密钥文件路径
$payload = [
    'iss' => config('services.apple.team_id'),
    'iat' => time(),
    'exp' => time() + 15777000, // 6个月有效期
    'aud' => 'https://appleid.apple.com',
    'sub' => config('services.apple.client_id'),
];

$clientSecret = JWT::encode($payload, $privateKey, 'ES256', config('services.apple.key_id'));
echo $clientSecret;

4. 确保前端正确传递code参数到回调路由

在AppleIDSignInOnSuccess回调中,必须将获取到的code和state通过URL参数传递给后端回调路由:

function AppleIDSignInOnSuccess(data) {
    // 跳转到后端回调路由,携带编码后的code和state
    window.location.href = '/auth/apple/callback?code=' + encodeURIComponent(data.code) + '&state=' + encodeURIComponent(data.state);
}

Laravel Socialite的user()方法会自动从请求中读取code参数,确保回调路由能正确接收到该参数。

5. 检查Apple开发者后台配置

  • 确认Service ID的Enabled Services中已勾选"Sign In with Apple"
  • 确认Service ID的Domains and Subdomains包含你的应用域名
  • 确认Return URLs中已添加后端的回调URI(和配置的redirect_uri完全一致)

6. 优化Socialite调用逻辑

你的回调代码中使用stateless()是正确的(前端发起的无状态登录),可以显式指定code参数确保Socialite能获取到:

public function handleAppleCallback(Request $request)
{
    $appleUser = Socialite::driver('apple')
        ->stateless()
        ->userFromCode($request->code); // 显式传入code参数
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 15:17:21