如何使用离线访问存储 google api 客户端对象(access_token 数组)并重用它

How to store google api client object (access_token array) with offline access and reuse it

跟随 google-api-php-client => documentation 我设法得到 $token = $client->fetchAccessTokenWithAuthCode($authorization_code); 数组:

$token array:6 [▼ ▼
  "access_token" => "***"
  "expires_in" => 3599
  "refresh_token" => "***"
  "scope" => "https://www.googleapis.com/auth/drive openid https://www.googleapis.com/auth/userinfo.email https://www.googleapis.com/auth/userinfo.profile"
  "token_type" => "Bearer"
  "id_token" => "***"
]

我用了 $client->setAccessType("offline"); 所以我得到了 "refresh_token" => "***"

文档提到:

If you use a Google API Client Library, the client object refreshes the access token as needed as long as you configure that object for offline access.

我知道要在没有用户交互的情况下访问 Google API 我需要做的是:

$client = new Google_Client();
$client->setAccessToken($token);

其中$token就是上面的数组。然后我可以拨打 api 个电话。

1) 我应该如何存储这个 $token 数组? 我只需要存储 refresh_token 吗?如果是这样,我如何重建 $token 数组以便 setAccessToken() 方法接受它?

2) 我应该将数组数据存储在哪里?在数据库中还是在其他地方?

您真的只需要存储刷新令牌。存储它的位置由您决定,但它应该是安全的,并且您应该指明刷新令牌所附加的用户。这样您就可以确定您不会因为混淆了他们的刷新令牌而向用户显示用户 b 数据。

众所周知,我只是将它们存储在一个文件夹中。

function getGoogleClient() {
    $client = getOauth2Client();

    // Refresh the token if it's expired.
    if ($client->isAccessTokenExpired()) {
        $client->fetchAccessTokenWithRefreshToken($client->getRefreshToken());
        file_put_contents($credentialsPath, json_encode($client->getAccessToken()));
    }
return $client;
}