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

PHP Curl调用Google Sheets API:如何自动获取更新令牌避免重复登录?

搞定Google Sheets API无需重复登录+刷新令牌获取问题

嘿,我来帮你解决这个头疼的问题!你现在的核心困扰其实是两个:一是怎么用Curl拿到刷新令牌(refresh token),二是如何让用户不用反复登录,同时安全处理认证信息——先明确说:绝对不能直接在代码里存用户账号密码,这既不安全也不符合Google的规范,咱用正确的OAuth2流程来解决。


一、先拿到刷新令牌的Curl请求写法

首先得记住:Google只有在用户第一次授权时(必须加access_type=offline参数),才会返回刷新令牌。这个令牌是用来后续自动获取新的访问令牌的,不用用户再登录。

1. 先引导用户授权(获取授权码)

你得先让用户访问这个授权URL(替换成你的客户端信息):

https://accounts.google.com/o/oauth2/auth?client_id=你的客户端ID&redirect_uri=你在Google控制台配置的回调地址&scope=https://www.googleapis.com/auth/spreadsheets&response_type=code&access_type=offline

用户登录授权后,会跳转到你的回调地址,带上code参数,这个就是授权码。

2. 用Curl换刷新令牌

拿到授权码后,用下面的Curl请求换令牌:

curl -X POST "https://oauth2.googleapis.com/token" \
  -H "Content-Type: application/x-www-form-urlencoded" \
  -d "client_id=你的客户端ID" \
  -d "client_secret=你的客户端密钥" \
  -d "grant_type=authorization_code" \
  -d "code=刚才拿到的授权码" \
  -d "redirect_uri=和上面一致的回调地址"

返回的JSON里会有refresh_token,一定要妥善保存! 这个令牌只会返回一次,丢了就得让用户重新授权。


二、实现无需重复登录的正确姿势

把刷新令牌加密存在你的服务器数据库里(比如用AES加密),之后每次调用API前,用刷新令牌自动换访问令牌,完全不用用户再操作。

结合你的现有代码示例

给你整合到你现有的插入逻辑里:

// 从POST获取参数
$nummer = $_POST['param1'];
$komm = $_POST['param2'];
$entnommen = $_POST['param3'];

// 第一步:用存储的刷新令牌获取新的访问令牌
$refreshToken = "从数据库取出的加密刷新令牌,解密后的值";
$curl = curl_init();
curl_setopt_array($curl, [
  CURLOPT_URL => "https://oauth2.googleapis.com/token",
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_POST => true,
  CURLOPT_POSTFIELDS => http_build_query([
    "client_id" => "你的客户端ID",
    "client_secret" => "你的客户端密钥",
    "grant_type" => "refresh_token",
    "refresh_token" => $refreshToken
  ]),
  CURLOPT_HTTPHEADER => [
    "Content-Type: application/x-www-form-urlencoded"
  ]
]);

$tokenResponse = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);

if ($err) {
  die("获取令牌出错: " . $err);
}

$tokenData = json_decode($tokenResponse, true);
$accessToken = $tokenData['access_token'];

// 第二步:用新的access_token调用Sheets API插入数据
$sheetUrl = "https://sheets.googleapis.com/v4/spreadsheets/你的表格ID/values/Sheet1!A1:append?valueInputOption=USER_ENTERED";
$curl = curl_init();
curl_setopt_array($curl, [
  CURLOPT_URL => $sheetUrl,
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_POST => true,
  CURLOPT_POSTFIELDS => json_encode([
    "values" => [
      [$nummer, $komm, $entnommen]
    ]
  ]),
  CURLOPT_HTTPHEADER => [
    "Authorization: Bearer " . $accessToken,
    "Content-Type: application/json"
  ]
]);

$insertResponse = curl_exec($curl);
curl_close($curl);

// 处理插入结果
echo "插入结果: " . $insertResponse;

三、关键安全提醒

  • 别把客户端密钥、刷新令牌硬编码在代码里!可以存在服务器环境变量或者加密的配置文件中。
  • 刷新令牌一定要加密存储,哪怕数据库被入侵,也不会泄露有效令牌。
  • 申请OAuth权限时,只选你需要的(比如spreadsheets.values.append),别申请全权限,降低风险。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 06:37:41