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
相关产品推荐
相关产品推荐

