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

Laravel PWA中Google登录出现invalid_grant错误求助

解决Laravel PWA Google登录Invalid Grant问题

问题根源

当PWA在部分设备上被强制跳转到外部浏览器完成Google OAuth授权时,外部浏览器与PWA属于独立的浏览器上下文,两者的Cookie、会话完全隔离。你当前使用的stateless()模式虽然绕过了Laravel的会话验证,但Google的授权码具有单次有效性,且与发起授权请求的客户端环境绑定,回到PWA后再使用该授权码换取令牌时,会因上下文不匹配或授权码已被隐性消耗而触发invalid_grant错误。

解决方案

1. 调整OAuth流程,解决跨上下文授权问题

去掉stateless(),改为结合临时存储(如Redis)处理跨上下文的授权状态验证:

修改授权发起路由(需确保你已定义该路由)

Route::get('/google-auth/redirect', function () {
    // 生成随机状态值,用于防CSRF和跨上下文验证
    $state = Str::random(40);
    // 将状态存入Redis,设置5分钟过期时间
    Redis::setex('oauth_state:' . $state, 300, 'valid');
    
    // 携带状态参数发起Google授权请求
    return Socialite::driver('google')
        ->with(['state' => $state])
        ->redirect();
});

修改回调路由

Route::get('/google-auth/callback', function (Request $request) {
    // 验证状态值有效性
    $state = $request->get('state');
    if (!Redis::exists('oauth_state:' . $state)) {
        abort(403, '无效的授权状态');
    }
    // 验证后删除状态,避免重复使用
    Redis::del('oauth_state:' . $state);

    // 移除stateless(),正常处理授权码交换
    try {
        $user_google = Socialite::driver('google')->user();
    } catch (\Exception $e) {
        abort(400, '授权失败:' . $e->getMessage());
    }

    $name = $user_google->user['given_name'] ?? 'Name';
    $lastname = $user_google->user['family_name'] ?? 'Lastname';

    $user = User::updateOrCreate([
        'google_id' => $user_google->id,
    ], [
        'name' => $name,
        'lastname' => $lastname,
        'email' => $user_google->email,
        'email_verified_at' => now(),
    ]);

    Auth::login($user);
    return redirect('/');
});

2. 验证Google OAuth重定向URI配置

  • 在Google Cloud Console的OAuth 2.0客户端ID设置中,确保已添加PWA的回调URL(如https://你的域名/google-auth/callback),且URL与实际请求的域名、路径完全匹配
  • 测试时避免使用localhost,改用真实域名或ngrok隧道,确保重定向URI的有效性

3. 优化PWA配置减少外部跳转(可选)

部分设备强制跳转外部浏览器与PWA的manifest配置有关,可调整manifest.json:

  • 设置display: standalone或display: fullscreen,强化PWA的独立应用属性
  • 添加prefer_related_applications: false,避免系统引导至原生应用

关键注意事项

  • Google授权码仅能使用一次,任何重复调用都会触发invalid_grant错误
  • 跨上下文的状态验证必须严格,防止CSRF攻击
  • 确保后端Redis或缓存服务正常运行,用于暂存授权状态

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 05:35:11