我正在使用带有PHP的Google工作表API,并按照可在此处找到的快速入门指南https://developers.google.com/sheets/quickstart/php
当我正确授权并将跟随的json文件存储在特定路径
时{
"access_token": "xxxxxxx",
"token_type": "Bearer",
"expires_in": 3600,
"refresh_token": "xxxxxx",
"created": 1472731452
}
在此过期后,我的代码
中会触发以下内容if ($client->isAccessTokenExpired()) {
$client->fetchAccessTokenWithRefreshToken(
$client->getRefreshToken()
);
$this->filesystem
->put(
self::CREDENTIALS,
json_encode($client->getAccessToken())
);
}
现在我的问题是,当代码被触发时,它会将我的文件更新为以下内容。
{
"access_token": "xxxxxxx",
"token_type": "Bearer",
"expires_in": 3600,
"created": 1472731452
}
正如您所看到的,不再有刷新令牌。当此令牌过期时,我开始收到以下错误
[LogicException]
refresh token must be passed in or set as part of setAccessToken
这是可以理解的,因为我不再有刷新令牌。
我的问题是为什么删除刷新令牌?我的调用方法与快速入门指南https://developers.google.com/sheets/quickstart/php
中的方法相同我在指南中专门讨论这部分
// Refresh the token if it's expired.
if ($client->isAccessTokenExpired()) {
$client->fetchAccessTokenWithRefreshToken($client->getRefreshToken());
file_put_contents($credentialsPath, json_encode($client->getAccessToken()));
}
答案 0 :(得分:3)
refresh_token
仅在用户的第一次授权时提供。后续授权(例如您在测试OAuth2集成时所使用的类型)将不会再次返回refresh_token
。 :)
refresh_token
。或者,您可以将查询参数prompt=consent
添加到OAuth重定向(请参阅Google的OAuth 2.0 for Web Server Applications页面)。
这将提示用户再次授权该应用程序,并始终返回refresh_token
。
答案 1 :(得分:2)
您的refresh token expired因为您的代码中设置的生命周期仅为3600秒/ 1小时。
{
"access_token": "xxxxxxx",
"token_type": "Bearer",
"expires_in": 3600, //refresh_token good for 1 hour
"refresh_token": "xxxxxx",
"created": 1472731452
}
在第一次授权代码交换期间,在离线方案中获取刷新令牌。在这些情况下,您的应用程序可能会通过向Google OAuth 2.0授权服务器发送刷新令牌来获取新的访问令牌。
要以这种方式获取新的访问令牌,您的应用程序会向https://www.googleapis.com/oauth2/v4/token发送HTTPS POST请求。请求必须包含以下参数:
此类请求将类似于以下内容:
POST /oauth2/v4/token HTTP/1.1
Host: www.googleapis.com
Content-Type: application/x-www-form-urlencoded
client_id=8819981768.apps.googleusercontent.com&
client_secret={client_secret}&
refresh_token=1/6BMfW9j53gdGImsiyUH5kU5RsR4zwI9lUVX-tqf8JXQ&
grant_type=refresh_token
选中此SO thread以获取更多参考。 希望这有帮助!