public function getClient()
{
$client = new Google_Client();
$client->setApplicationName($this->application_name);
$client->setClientId($this->client_id);
$client->setClientSecret($this->client_secred);
$client->setScopes($this->scopes);
$client->setAuthConfig($this->client_secret_path);
$client->setRedirectUri($this->redirect_uri);
$client->setAccessType("offline");
$client->setApprovalPrompt('force');
$client->setIncludeGrantedScopes(true);
if (file_exists($this->client_credential_path))
{
$access_token = json_decode(file_get_contents($this->client_credential_path), true);
} else
{
if (isset($_GET['code']))
{
$authCode = $_GET['code'];
// Exchange authorization code for an access token.
$access_token = $client->authenticate($authCode);
$access_token['refresh_token'] = $client->getRefreshToken();
// Store the credentials to disk.
if (array_key_exists('access_token', $access_token))
{
if (!file_exists(dirname($this->client_credential_path)))
{
mkdir(dirname($this->client_credential_path), 0700, true);
}
file_put_contents($this->client_credential_path, json_encode($access_token));
}
} else
{
// Request authorization from the user.
$authUrl = $client->createAuthUrl();
header('Location: ' . filter_var($authUrl, FILTER_SANITIZE_URL));
exit;
}
}
$client->setAccessToken($access_token);
if ($client->isAccessTokenExpired())
{
$refresh_token = isset($access_token['refresh_token']) ? $access_token['refresh_token'] : NULL;
$client->refreshToken($refresh_token);
$new_access_token = $client->getAccessToken();
$new_access_token['refresh_token'] = $refresh_token;
file_put_contents($this->client_credential_path, json_encode($new_access_token));
$client->setAccessToken($new_access_token);
}
return $client;
}
При получении токена использую кусок кода выше, токен получаю, с полученным токеном подключаюсь к файлам на google drive, все работает.
По истечении времени жизни токена отрабатывает кусок кода ниже
if ($client->isAccessTokenExpired())
{
$refresh_token = isset($access_token['refresh_token']) ? $access_token['refresh_token'] : NULL;
$client->refreshToken($refresh_token);
$new_access_token = $client->getAccessToken();
$new_access_token['refresh_token'] = $refresh_token;
file_put_contents($this->client_credential_path, json_encode($new_access_token));
$client->setAccessToken($new_access_token);
}
После этого я получаю новый токен, но с этим новым токеном я уже не могу подключиться к сервисам, выдает ошибку
Google_Service_Exception [ 401 ]: { "error": { "code": 401, "message": "Request had invalid authentication credentials.", "errors": [ { "message": "Request had invalid authentication credentials.", "domain": "global", "reason": "unauthorized" } ], "status": "UNAUTHENTICATED" } }
Еще одно странное поведение, если я получаю новый токен без рефреша с теми же Scopes, этот новый токен выдает такую же ошибку. После смены Scopes на другие и получения нового токена он снова работает нормально до рефреша.
В какую сторону копать, то что рефрешить токен можно не более 25 раз в сутки я знаю, лимиты запросов тоже не переступал.
PS: опытным путем было установлено что новый токен который мы получили после рефреша начинает тоже работать после того как мы меняем Scopes на другие :-) что за странное поведение?