RefreshToken 在我获得新令牌 google 张 API 后没有被发回

RefreshToken Not getting send back after I get new token google sheets API

我正在使用 google 工作表 API 和 PHP 并遵循可以在此处找到的快速入门指南 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()));
}

你的 refresh token expired 因为你代码中设置的生命周期是 3600 秒 only/1 小时。

{
"access_token": "xxxxxxx",
"token_type": "Bearer",
"expires_in": 3600, //refresh_token good for 1 hour
"refresh_token": "xxxxxx",
"created": 1472731452
}

Using a refresh token

第一次授权码交换时,离线场景获取refresh token。在这些情况下,您的应用程序可能会通过向 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 以获取更多参考。 希望这对您有所帮助!