Я начал настраивать календарь Google для своего нового приложения. Я почти сделал точную копию кода аутентификации, отображаемого у разработчиков Google ( https://developers.google.com/google-apps/calendar/instantiate ), но я продолжаю получать следующую ошибку:
Ошибка получения маркера доступа OAuth2, сообщение: 'invalid_grant'
В настоящее время я использую Fork-CMS ( http://www.fork-cms.com ), молодую Lightweigth CMS. Я правильно настроил файл config.php google-api-php-client. (client-id, client-secret, redirect-uri, ключ разработки, …), а перенаправление uri правильно установлено на консоли google api. Мой код выглядит следующим образом:
<?php /** * This is a widget with a calendar implementation. * * @package frontend * @subpackage events * * @author Michiel Vlaminck <michielvlaminck@gmail.com> */ class FrontendEventsWidgetCalendar extends FrontendBaseWidget { private $events = array(); private $authUrl = array(); /** * Execute the extra * * @return void */ public function execute() { // call parent parent::execute(); // load template $this->loadTemplate(); // get data $this->getData(); // parse $this->parse(); } /** * Get the data from Google Calendar * This method is only executed if the template isn't cached * * @return void */ private function getData() { require_once PATH_LIBRARY . '/external/google-api-php-client/src/apiClient.php'; require_once PATH_LIBRARY . '/external/google-api-php-client/src/contrib/apiCalendarService.php'; $client = new apiClient(); $service = new apiCalendarService($client); if (isset($_SESSION['oauth_access_token'])) { $client->setAccessToken($_SESSION['oauth_access_token']); } else { $token = $client->authenticate(); $_SESSION['oauth_access_token'] = $token; } if ($client->getAccessToken()) { $calId = FrontendEventsModel::getCalendarId((int) $this->data['id']); $calId = $calId[0]['calendar_id']; $events = $service->events->listEvents($calId); $this->events = $events['items']; $_SESSION['oauth_access_token'] = $client->getAccessToken(); } else { $this->authUrl = $client->createAuthUrl(); } } /** * Parse * * @return void */ private function parse() { $this->tpl->assign('events', $this->events); $this->tpl->assign('authUrl', $this->authUrl); } } ?>
Когда я открываю эту страницу виджетов в первый раз, я получаю направленную на Google проверку подлинности приложения. Когда я соглашусь, я перенаправляюсь к своему приложению, и это тот момент, когда я получаю:
apiAuthException » Main Message Error fetching OAuth2 access token, message: 'invalid_grant' File C:\wamp\www\Officevibes\library/external\google-api-php-client\src\auth\apiOAuth2.php Line 105 Date Thu, 05 Apr 2012 08:34:47 +0000 URL http://localhost/calendar?code=4/YPUpFklKvhEeTcMm4moRth3x49oe Referring URL (Unknown) Request Method GET User-agent Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.142 Safari/535.19
Вы должны повторно использовать токен доступа, который вы получаете после первой успешной проверки подлинности. Вы получите ошибку invalid_grant
если ваш предыдущий токен еще не истек. Кэшируйте его где-нибудь, чтобы вы могли его повторно использовать.
У меня была аналогичная проблема, вызванная неправильным временем на моем сервере. Убедитесь, что синхронизация ваших системных часов.
Перейдите в консоль Google API ( https://code.google.com/apis/console/ ) и отмените секретный ключ клиента под идентификатором клиента для установленных приложений .
Обязательно обновите свой код с помощью новой Client Secret
Вы также получите эту ошибку, если по ошибке попробуете аутентифицировать свой токен идентификатора , а не токен доступа .
Поэтому не будьте похожими на меня – убедитесь, что вы передали правильный токен в свой код!