срок действия токена в API Google php - PullRequest
0 голосов
/ 06 мая 2020

Я создаю приложение, которому требуется google api auth. в первый раз перенаправить в Google и получить токен и сохранить токен в базе данных:

require __DIR__ . '/vendor/autoload.php';
$client = new Google_Client();
$client->setAuthConfigFile(__DIR__ . '/credentials.json');
$client->setRedirectUri('http://' . $_SERVER['HTTP_HOST'] . '/index.php');
$client->addScope(Google_Service_Drive::DRIVE);
$client->setAccessType('offline');
if ( !isset($_GET['code']) ) {
    $auth_url = $client->createAuthUrl();
    header('Location: ' . filter_var($auth_url, FILTER_SANITIZE_URL));
} else {
    $client->authenticate($_GET['code']);
    $token=$client->fetchAccessTokenWithAuthCode($_GET['code']);
    $token=$token['access_token'];
    update_option('iwp_google_drive_token',$token);
}

, но когда я хочу использовать токен. isAccessTokenExpired() функция всегда возвращает истину.

require __DIR__ . '/vendor/autoload.php';
$client = new Google_Client();
$client->setAuthConfigFile(__DIR__ . '/credentials.json');
$client->setRedirectUri('http://' . $_SERVER['HTTP_HOST'] . '/index.php');
$client->addScope(Google_Service_Drive::DRIVE);
$client->setAccessType('offline');
$client->setAccessToken(get_option('iwp_google_drive_token'));
var_dump($client->isAccessTokenExpired());

1 Ответ

0 голосов
/ 06 мая 2020

Я исправил проблему. Токен должен сохраняться в файле точно так же, как возвращенный из Google. но моя ошибка заключалась в том, что я разбираю токен и сохраняю только $token['access_token']. так:

require __DIR__ . '/vendor/autoload.php';
$client = new Google_Client();
$client->setAuthConfigFile(__DIR__ . '/credentials.json');
$client->setRedirectUri('http://' . $_SERVER['HTTP_HOST'] . '/index.php');
$client->addScope(Google_Service_Drive::DRIVE);
$client->setAccessType('offline');
$client->setApprovalPrompt ("force");
if ( !isset($_GET['code']) ) {
    $auth_url = $client->createAuthUrl();
    header('Location: ' . filter_var($auth_url, FILTER_SANITIZE_URL));
} else {
    $client->authenticate($_GET['code']);
    $token=$client->fetchAccessTokenWithAuthCode($_GET['code']);
    $client->setAccessToken($accessToken);
    file_put_contents(__DIR__ .'/'.$tokenPath, json_encode($client->getAccessToken()));
}

и читать токен из файла и использовать json_decode:

require __DIR__ . '/vendor/autoload.php';
$client = new Google_Client();
$client->setAuthConfigFile(__DIR__ . '/credentials.json');
$client->setRedirectUri('http://' . $_SERVER['HTTP_HOST'] . '/index.php');
$client->addScope(Google_Service_Drive::DRIVE);
$client->setAccessType('offline');
$tokenPath = 'token.json';
if (file_exists($tokenPath)) {
  $accessToken = json_decode(file_get_contents(__DIR__ .'/'.$tokenPath), true);
  $client->setAccessToken($accessToken);
}
var_dump($client->isAccessTokenExpired());
...