#php #google-api #google-oauth #google-api-php-client
Вопрос:
У меня возникли проблемы с приложениями, которые запрашивают у пользователя доступ к приложению после истечения срока действия токена (1 час). Я искал старые проблемы, но мне ничего не помогло. Если у кого-нибудь есть время просмотреть мой код и найти ошибку, я был бы признателен.
function getClient()
{
$client = new Google_Client();
$redirect_uri = 'http://' . $_SERVER['HTTP_HOST'] . $_SERVER['PHP_SELF'];
//disable SSL
$guzzleClient = new GuzzleHttpClient(array( 'curl' => array( CURLOPT_SSL_VERIFYPEER => false, ), ));
$client->setHttpClient($guzzleClient);
$sample_passthrough_value = 'someregularstring22';
$client->setApplicationName('GDrive_Trello');
$client->setScopes('https://www.googleapis.com/auth/drive');
$client->setAuthConfig('credentials.json');
$client->setState($sample_passthrough_value);
$client->setRedirectUri($redirect_uri);
$client->setAccessType('offline');
$client->setIncludeGrantedScopes(true);
$tokenPath = 'token.json';
if (file_exists($tokenPath)) {
$accessToken = json_decode(file_get_contents($tokenPath), true);
$client->setAccessToken($accessToken);
}
if ($client->isAccessTokenExpired()) {
if ($client->getRefreshToken()) {
$client->fetchAccessTokenWithRefreshToken($client->getRefreshToken());
} else {
$authUrl = $client->createAuthUrl();
header("Location: " . $authUrl);
if(isset($_GET['code'])){
$authCode = $_GET['code'];
header('Location: ' . filter_var($redirect_uri, FILTER_SANITIZE_URL));
} else{
$authCode= null;
}
$accessToken = $client->fetchAccessTokenWithAuthCode($authCode);
$client->setAccessToken($accessToken);
if (array_key_exists('error', $accessToken)) {
throw new Exception(join(', ', $accessToken));
}
}
if (!file_exists(dirname($tokenPath))) {
mkdir(dirname($tokenPath), 0700, true);
}
file_put_contents($tokenPath, json_encode($client->getAccessToken()));
}
return $client;
}
Комментарии:
1. Если вы не храните маркер обновления в каком-то месте, куда он направляется. что находится в файле, хранящемся в токене. json не загружает маркер обновления.
2. Знак. json содержит токен обновления, если вы на это указываете? Если это не так, я не знаю, что мне делать. Можете ли вы привести мне пример? Заранее спасибо!
Ответ №1:
Первое, что вам нужно сделать, это начать считывать токен обновления с токена.файл json. У меня сейчас не установлен php, поэтому я не могу это проверить. Просто убедитесь, что вы загрузили его, а затем используете setRefreshToken
, чтобы установить его как часть объекта клиента. Чтобы проверить это, просто распечатайте объект $client, чтобы убедиться, что он установлен.
$tokenPath = 'token.json';
if (file_exists($tokenPath)) {
$accessToken = json_decode(file_get_contents($tokenPath), true);
$refresToken= // do something hear to load that refresh token;
$client->setAccessToken($accessToken);
$client->RefreshToken($refresToken);
}
Затем, когда вы проверяете наличие isAccessTokenExpired
библиотеки, она должна автоматически загружать вам новый токен доступа.
if ($client->isAccessTokenExpired()) {
$client->fetchAccessTokenWithRefreshToken($client->getRefreshToken());
file_put_contents($credentialsPath, json_encode($client->getAccessToken()));
}
Комментарии:
1. Хорошая логика, к сожалению, такого метода setRefreshToken не существует, но я постараюсь придерживаться этой логики. Еще раз спасибо!
2. Удалите набор его просто обновить $клиент->Обновить($_SESSION[‘refresh_token’]) — это то, что я использую, когда это веб-приложение