Я знаю, что это старый вопрос, но я застрял в той же ошибке, используя реализацию PHP (бета-версию) API (2016-01-06), потому что я изначально думал, что setAuthConfigFile
- это все, что было нужно:
$client = new Google_Client();
$client->setApplicationName('MyCalendarAppName');
$client->setAuthConfigFile(APPPATH.'client_secret.json'); //file downloaded from GDC:
// https://console.developers.google.com/apis/credentials?project=YOUR-PROJECT-ID
$client->addScope(Google_Service_Calendar::CALENDAR_READONLY);
$service = new Google_Service_Calendar($client);
Ошибка на самом деле не из-за «дневного лимита» запросов, а из-за того, что я (владелец аккаунта Google) явно не давал разрешения на доступ к календарю. Вот как это сделать:
- получить доступ к URL-адресу, возвращенному методом
createAuthUrl()
(который можно вызвать перед вызовом службы);
- появляется форма «Запретить» и «Разрешить» для доступа к календарям & ndash; нажмите Разрешить ;
- код возвращается & ndash; скопируйте и вставьте этот код в метод
authenticate($code)
и вуаля, не более 403: превышен дневной лимит ошибки.
Для этого просто используйте следующие строки перед вызовом сервиса:
//$client->createAuthUrl();
// - invoke the method above one time only: returns a URL with the "Allow" form
// which will give the code for authentication
$client->authenticate('YOUR_CODE_GOES_HERE');
$service = new Google_Service_Calendar($client); //invokes the Calendar service
Однако это позволит одноразовый доступ к календарю. Если вы попробуете это дважды, вы получите:
Google_Auth_Exception: Ошибка при получении токена доступа OAuth2, сообщение: «invalid_grant: код уже был погашен."
Это означает, что токен необходим для повторной обработки календаря с восстановленным кодом . Этот токен возвращается методом authenticate
и может быть назначен клиенту с помощью метода setAccessToken
:
//get the access token you previously stored or get a new one to be stored:
$accessToken = $client->authenticate('YOUR_CODE_GOES_HERE');
//after the if-else blocks...
$client->setAccessToken($accessToken);
//refresh the token if it's expired
if ($client->isAccessTokenExpired())
$client->refreshToken($client->getRefreshToken());
Цель состоит в том, чтобы многократно использовать этот токен доступа (неявно также повторно использовать выкупленный код) и вызывать refreshToken
только после истечения срока действия токена. Быстрый запуск Google создает специальный файл для хранения этого токена (calendar-php-quickstart.json) и использует метод authenticate
, только если токен не найден в этом файле. То есть setAccessToken
- единственный метод аутентификации Клиента (кроме setAuthConfigFile
), который необходимо использовать в последующих запросах.
Я только полностью понял эту логику OAuth 2.0 , пройдя через эти ошибки, и поскольку этот вопрос уже привлек так много людей, возможно, это может помочь другим ...