如何将access token和refresh token传入Google Sheets客户端?
问题根因
- gapi.client.init 不支持直接传入
refresh_token参数,且你自行传入的access_token不会被gapi自动加载到请求头中,导致请求缺失鉴权信息,触发401错误 - 你在test.php中的access_token刷新逻辑有缺陷:刷新得到新的access_token后没有写回token.json文件,导致import.php读取的始终是旧的过期凭证
- 同时传入API Key和OAuth2凭证会导致鉴权逻辑冲突,使用OAuth2访问私有接口时不需要携带API Key
修复步骤
1. 修复test.php的token持久化逻辑
在test.php中刷新access_token的代码块末尾,增加新token的持久化操作:
// 原有刷新token逻辑 $response = curl_exec($ch); curl_close ($ch); // 新增:把新的token写回token.json file_put_contents('token.json', $response);
2. 修复import.php的gapi鉴权逻辑
删除init方法中无效的clientId、refresh_token、apiKey参数,手动给gapi设置全局授权头,修改后的代码如下:
function makeApiCall() { var params = { spreadsheetId: "1qBX_v***", range: "CSV-to-Google-Sheet", valueInputOption: 'RAW', } var valueRangeBody = { "values": <?php echo '[' . implode(',', $newData) . ']'; ?> }; var request = gapi.client.sheets.spreadsheets.values.update(params, valueRangeBody); request.then(function(response) { }, function(reason) { console.error('error2: ' + reason.result.error.message); }); } <?php $response = file_get_contents('token.json'); $array = json_decode($response); ?> var access_token = <?php echo "'".$array->access_token."'"; ?>; function initClient() { gapi.client.init({ 'discoveryDocs': ['https://sheets.googleapis.com/$discovery/rest?version=v4'], }).then(function() { // 关键:手动设置全局请求授权头 gapi.client.setToken({ access_token: access_token }); makeApiCall(); }); }
优化建议
你可以直接在PHP服务端调用Google Sheets API完成数据写入,不需要把access_token暴露到前端,安全性更高,也能避免前端鉴权的各类兼容问题。
内容的提问来源于stack exchange,提问作者DorFik
相关产品推荐
相关产品推荐

