API Календаря Google не работает в автономном режиме. где взять токен обновления в контроллере codeigniter

Я использую Google Calendar API для отображения событий в fullcalendar (поэтому я использую объект json на мой взгляд). Я использую php-фреймворк codeignitor, и у меня в контроллере есть несколько функций для создания нового клиента, затем я использую это в функции oauth2callback () для обмена моего кода на access_token, затем я начинаю вызывать сервис в gcalendar () и gcalendar_events. Я установил accessType в автономный режим, но это не делает меня доступ к событиям в автономном режиме. Это прекрасно работает, за исключением того, что меня перенаправляют на вход в систему каждый раз, когда заканчивается сессия. Я не хочу этого, я хочу, чтобы они отображались все время после окончания сеанса. Я пытаюсь использовать токен обновления в случае, если срок действия access_token истекает, чтобы увидеть, если это решит проблему.

это код в моем контроллере

    function getClient() {
$client = new Google_Client();
$client->setApplicationName("DL Calendar");
$client->setAuthConfig('application/client_secrets.json');
$client->addScope('profile');
$client->setIncludeGrantedScopes(true);
$client->setAccessType('offline');

return $client;
}

function gcalendar() {
$this->load->add_package_path(APPPATH . 'vendor/autoload');

$client = $this->getClient();
//$client->setRedirectUri(site_url('calendar/index'));
$client->addScope(Google_Service_Calendar::CALENDAR);

if (isset($_SESSION['access_token']) && $_SESSION['access_token']) {

$client->setAccessToken($_SESSION['access_token']);
$access_token = $_SESSION['access_token'];

$service = new ]Google_Service_Calendar($client);
$calendar = new Google_Service_Calendar_Calendar();
//$calendarList = $service->calendarList->listCalendarList();
$calendar = $service->calendars->get('primary');

$params = array(
'owner_id' => get_current_user_id(),
'title' => get_current_user(). ' ' .'Google Calendar',
'type' => 'gcal',
'url' => $calendar->id,
);

$calendar_id = $this->Calendar_model->add_calendar($params);
redirect('calendar/index');

} else {

$redirect_uri = site_url('calendar/oauth2callback');
header('Location: ' . filter_var($redirect_uri, FILTER_SANITIZE_URL));
}
$this->session->set_flashdata('success', 'Event Successfully Added');
}

function oauth2callback () {

    //Build the client object
$client = $this->getClient();
$client->addScope(Google_Service_Calendar::CALENDAR);
$service = new Google_Service_Calendar($client);

$url = parse_url($_SERVER['REQUEST_URI']); parse_str($url['query'], $params);
$code = $params['code'];

//To exchange an authorization code for an access token, use the authenticate method:
if (! isset($code)) {
$auth_url = $client->createAuthUrl();
header('Location: ' . filter_var($auth_url, FILTER_SANITIZE_URL));

} else {

$token = $client->fetchAccessTokenWithAuthCode($code);
$client->setAccessToken($token);
$client->authenticate($code);
$_SESSION['access_token'] = $client->getAccessToken();
$redirect_uri = site_url('calendar/gcalendar');
header('Location: ' . filter_var($redirect_uri, FILTER_SANITIZE_URL));
}

}

function gcalendar_events() {
$client = $this->getClient();

$client->addScope(Google_Service_Calendar::CALENDAR);
// $client->setRedirectUri(site_url('calendar/gcalendar'));
$client->setAccessType('offline'); //need calendar events to appear even if not logged in to google
if (isset($_SESSION['access_token']) && $_SESSION['access_token']) {

$client->setAccessToken($_SESSION['access_token']);
$access_token = $_SESSION['access_token'];

$service = new Google_Service_Calendar($client);
$id = 'primary';
$calendar = new Google_Service_Calendar_Calendar();
$calendar = $service->calendars->get('primary');

$event = new Google_Service_Calendar_Event();

$events = $service->events->listEvents($id);

foreach ($events->getItems() as $event) {

$startTime = strtotime($event->getStart()->dateTime)  ;
$endTime = strtotime($event->getEnd()->dateTime);
$start = date('Y-m-d H:i:s', $startTime);
$end = date('Y-m-d H:i:s', $endTime);

$eventsArr[] = array(
'title' => $event->getSummary(),
'start'=> $start,
'end' =>  $end,
);
}
// Return a single `events` with all the `$eventsArr`
echo json_encode($eventsArr);}
}

Проблема в моей сессии заканчивается? или срок действия маркера доступа истек, и мне нужен токен обновления? где я могу установить токен обновления, потому что я попытался поместить его более чем в одно место, и я получаю сообщение об ошибке, что токен обновления должен быть установлен как часть off setAccessToken. Я положил все это и все еще получил сообщения об ошибках.

Вот код, который я использовал

     if ($client->isAccessTokenExpired()) {
$refresh_token =     $client->fetchAccessTokenWithRefreshToken($client->getRefreshToken());
$client->setAccessToken($refresh_token);
$_SESSION['access_token'] = $refresh_token;
$this->load->helper('file');
write_file('application/client_secrets.json',   json_encode($client->getAccessToken()));
} else {
$access_token = $_SESSION['access_token'];
}

Я только что заметил, что когда-то в моей авторизации говорилось «предоставить автономный доступ», но теперь в нем больше не упоминается, хотя в документации Google говорится

После того как пользователь предоставит автономный доступ к запрошенным областям, вы можете
продолжать использовать клиент API для доступа к API Google на пользователях
имени, когда пользователь не в сети. Клиентский объект обновит
токен доступа по мере необходимости.

введите описание изображения здесь

0

Решение

я думаю это Автономный доступ в руководстве OAuth может помочь тебе Поскольку вы используете PHP, попробуйте установить тип доступа «офлайн».

Если вашему приложению требуется автономный доступ к Google API, установите тип доступа клиента API в автономный режим:

$client->setAccessType("offline");

После того как пользователь предоставит автономный доступ к запрошенным областям, вы можете продолжать использовать клиент API для доступа к API Google от имени пользователя, когда он находится в автономном режиме. Клиентский объект обновит токен доступа по мере необходимости.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]