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

PHP实现Google OAuth登录时isset($_GET['code'])返回false是什么原因?

Google OAuth PHP开发code参数不存在问题排查方案

常见原因

  • Google Cloud控制台配置的授权重定向URI与代码中setRedirectUri参数不匹配,是该问题最高发的原因,只要两者存在任意差异(包括http/https协议、端口号、路径、末尾斜杠),Google都会拒绝携带code参数回调,甚至直接返回错误。
  • 代码未开启session就调用$_SESSION变量,触发PHP报错导致跳转,丢失code参数。
  • 站点配置了HTTP强制跳转HTTPS,Google回调到HTTP地址时触发跳转,query参数被丢弃。
  • 伪静态重写规则未配置保留查询参数,code参数被过滤。
  • 用户点击登录后选择取消授权,Google回调只会返回error参数,不会携带code。
  • client_secret.json文件路径错误,生成的授权链接无效,回调自然不会携带code。

解决步骤

  1. 核对重定向URI配置:打开Google Cloud控制台→API和服务→凭据→找到对应OAuth 2.0客户端ID,确保「已授权的重定向 URI」与代码中setRedirectUri的参数完全一致。如果站点已启用HTTPS,必须将两处的地址都改为HTTPS开头。
  2. 在代码最顶部(所有逻辑之前)添加session_start();开启会话,避免session调用报错。
  3. 检查伪静态规则:Apache的重写规则末尾添加[QSA,L]保留查询参数;Nginx的try_files规则补充$query_string参数。
  4. 添加错误捕获逻辑:在判断$_GET['code']之前新增对$_GET['error']的判断,直接打印Google返回的错误原因,快速定位问题。
  5. 调试授权链接:打印$client->createAuthUrl()生成的链接手动访问,授权后观察地址栏是否携带code参数,验证链接有效性。

注意:性别信息需要用户在Google账号中填写并设为公开才会返回,若用户未设置该字段,返回值会为空,属于正常情况。

修正后参考代码

<?php
// 最顶部优先开启会话
session_start();
include ("header.php");
require_once 'vendor/autoload.php';

// 校验密钥文件是否存在,避免路径错误
if (!file_exists('client_secret.json')) {
    exit('client_secret.json 文件不存在,请检查路径配置');
}

$client = new Google_Client();
$client->setAuthConfig('client_secret.json');
$client->setRedirectUri('http://localhost/ecommerce/index.php');
$client->addScope('email');
$client->addScope('profile');

// 捕获Google返回的授权错误
if (isset($_GET['error'])) {
    exit('Google授权失败,错误信息:' . $_GET['error']);
}

if (isset($_GET['code'])) {
    $token = $client->fetchAccessTokenWithAuthCode($_GET['code']);
    if (!isset($token['error'])) {
        $client->setAccessToken($token['access_token']);
        $_SESSION['access_token'] = $token['access_token'];
        $google_service = new Google_Service_Oauth2($client);
        $data = $google_service->userinfo->get();
        
        if (!empty($data['given_name'])) {
            $_SESSION['uid'] = $data['given_name'];
        }
        if (!empty($data['family_name'])) {
            $_SESSION['user_last_name'] = $data['family_name'];
        }
        if (!empty($data['gender'])) {
            $_SESSION['gender'] = $data['gender'];
        }
        
        // 授权成功后跳转清除url中的code参数,避免重复提交
        header('Location: http://localhost/ecommerce/index.php');
        exit;
    } else {
        exit('获取访问令牌失败,错误信息:' . $token['error']);
    }
}

// 生成登录按钮
$login_button = '<div class="col-sm-4">
    <div class="card">
        <div class="card-body">
            <a class="btn btn-social btn-google" href="'.$client->createAuthUrl().'" role="button">
                <i class="fab fa-google"></i>
                Sign in with Google
            </a>
        </div>
    </div>
</div>';
?>

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 05:39:02