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

PHP使用cURL调用Google API获取用户邮箱返回invalid_request错误

问题描述

通过Google OAuth2.0接口获取用户邮箱地址,技术栈选用PHP搭配cURL实现接口请求,预期交互流程如下:

  • 用户点击登录按钮,页面跳转至Google授权页,请求携带scope、access_type等必填参数
  • 用户选择对应谷歌账号完成授权后,回跳至业务回调页面,回调页的逻辑处理阶段出现报错
已尝试方案

已检索同类问题并多次调整代码,仅找到相关问题讨论帖但帖中无有效解决方案,且问题场景和当前情况不完全匹配。
接口返回错误信息如下:

Array
(
    [error] => invalid_request
    [error_description] =>  You can't sign in to this app because it doesn't comply with Google's OAuth 2.0 policy for keeping apps secure. You can let the app developer know that this app doesn't comply with one or more Google validation rules.
  
)

已对照Google官方公布的OAuth2.0重定向URI校验规则逐一核查,认为代码符合规则要求。

相关代码

说明:代码中$google_id和$google_secret已提前定义,赋值为正确的凭据值。

$code = $_GET["code"];

if (!isset($code)) exit();

# Google OAuth2 token接口地址
$url = "https://oauth2.googleapis.com/token";

# POST请求参数
$redirect_uri = urlencode("http://localhost:9000/loginWithGoogleProcess.php"); # 回调地址
$fields = array(
    'code' => $code,
    'client_id' => $google_id,
    'client_secret' => $google_secret,
    'redirect_uri' => $redirect_uri,
    'grant_type' => "authorization_code"
);

# 拼接请求参数字符串
$fields_string = http_build_query($fields);

# 初始化cURL连接
$ch = curl_init();

# 设置基础请求参数
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $fields_string);

# cURL SSL配置(注释说明不加这两行响应会返回false)
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);

# 配置curl_exec返回结果内容而非直接输出
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 

# 执行POST请求
$result = json_decode(curl_exec($ch), true);

print_r($result);

代码执行后print_r输出结果和接口返回错误一致:

Array
(
    [error] => invalid_request
    [error_description] =>  You can't sign in to this app because it doesn't comply with Google's OAuth 2.0 policy for keeping apps secure. You can let the app developer know that this app doesn't comply with one or more Google validation rules.
  
)
问题原因与修复方案

报错核心是参数传递和后台配置不匹配,按以下顺序排查修复即可:

  1. 修复双重编码的回调地址
    你对$redirect_uri提前做了urlencode处理,但后续调用http_build_query拼接参数时,函数本身会自动对所有参数值做URL编码,相当于给回调地址做了双重编码,Google服务端拿到的回调地址是编码后的乱码字符串,和后台配置的合法地址完全不匹配,直接触发安全校验失败。
    修改回调地址定义,去掉手动urlencode即可:
$redirect_uri = "http://localhost:9000/loginWithGoogleProcess.php";

注意:换token步骤传入的redirect_uri必须和用户跳转授权页时携带的redirect_uri完全一致,包括协议、域名、端口、路径、大小写,末尾不能多斜杠或者少参数。

  1. 核对开发者后台配置
  • 确认当前使用的OAuth客户端类型为「Web应用」
  • 把http://localhost:9000/loginWithGoogleProcess.php完整添加到该客户端的「已授权重定向URI」列表中,添加后等待3-5分钟配置生效再测试
  • 如果应用还处于测试发布阶段,需要把测试用的谷歌账号添加到后台的「测试用户」列表,未发布的应用仅列表内账号可以完成授权流程
  1. 修正cURL SSL配置(强烈建议)
    你当前关闭了cURL的SSL证书校验,本身不符合Google OAuth的安全传输要求,还存在中间人攻击风险。本地PHP环境可下载最新CA证书文件,在php.ini中配置curl.cainfo指向证书路径后,删除以下两行关闭校验的代码:
// 移除以下两行配置
// curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
// curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 00:57:33