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。
解决步骤
- 核对重定向URI配置:打开Google Cloud控制台→API和服务→凭据→找到对应OAuth 2.0客户端ID,确保「已授权的重定向 URI」与代码中
setRedirectUri的参数完全一致。如果站点已启用HTTPS,必须将两处的地址都改为HTTPS开头。 - 在代码最顶部(所有逻辑之前)添加
session_start();开启会话,避免session调用报错。 - 检查伪静态规则:Apache的重写规则末尾添加
[QSA,L]保留查询参数;Nginx的try_files规则补充$query_string参数。 - 添加错误捕获逻辑:在判断
$_GET['code']之前新增对$_GET['error']的判断,直接打印Google返回的错误原因,快速定位问题。 - 调试授权链接:打印
$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
相关产品推荐
相关产品推荐

