2016-10-19 4 views
0

Ich benutze Google Kalender-API, um Ereignisse auf Vollkalender anzuzeigen (also mit einem Json-Objekt in meiner Ansicht). Ich benutze Codeignitor PHP-Framework, und ich habe ein paar Funktionen in meinem Controller, um einen neuen Client zu erstellen, dann benutze ich das in der oauth2callback() -Funktion, um meinen Code für ein Access_Token auszutauschen, dann beginne ich den Dienst in gcalendar() und gcalendar_events. Ich habe den accessType auf offline gesetzt, aber das scheint mich nicht auf die Ereignisse offline zugreifen zu lassen. Es funktioniert gut, außer dass ich umgeleitet werde, um mich jedes Mal neu anzumelden, wenn die Sitzung endet. Ich will das nicht, ich möchte, dass sie die ganze Zeit nach dem Ende der Sitzung angezeigt werden. Ich versuche, ein Aktualisierungstoken zu verwenden, falls das access_token abläuft, um zu sehen, ob das das Problem beheben würde.Google Kalender aktualisieren Token und Codeinformation

Dies ist der Code in meinem Controller

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'); 
} 

Funktion 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); 


    } 
} 

Ist das Problem in meiner Sitzung zu beenden? oder läuft das Zugriffstoken ab und ich benötige ein Aktualisierungstoken? Wo setze ich das Refresh-Token, weil ich versucht habe, es an mehr als einem Ort zu platzieren, und ich bekomme eine Fehlermeldung, dass das Refresh-Token als Teil von setAccessToken gesetzt werden muss. Ich habe alles übergelaufen und immer noch Fehlermeldungen erhalten. Hier

ist der Code, den ich verwenden

 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']; 
      } 

Ich habe gerade bemerkt, dass es einmal zu sagen pflegt ‚gewährt die Offline-Zugriff‘ in meiner Genehmigung aber jetzt ist es nicht erwähnt länger, dass, während Google Dokumentation sagt „Nach einem Benutzer Wenn Sie den Offlinezugriff auf die angeforderten Bereiche gewähren, können Sie weiterhin den API-Client verwenden, um im Namen des Benutzers auf Google APIs zuzugreifen, wenn der Benutzer offline ist. Das Clientobjekt aktualisiert das Zugriffstoken bei Bedarf. "

enter image description here

Antwort

0

Während der ersten Zulassung mit Google, erhalten Sie einen Token erhalten, die in 3600 Sekunden oder eine Stunde ablaufen. Daher müssen Sie das Aktualisierungstoken verwenden, um ein neues funktionierendes Token zu erhalten.

Es ist so etwas wie SO question.

$token = $client->getAccessToken(); 
$authObj = json_decode($token); 
if(isset($authObj->refresh_token)) { 
save_refresh_token($authObj->refresh_token); 
} 

Stellen Sie sicher, dass Sie dieses refresh_token speichern.

Sie können es mit Update:

$client->refreshToken($your_saved_refresh_token); 

Und dann stellen Sie Ihren neuen Zugriffstoken zur Sitzung:

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

Ich schlage vor, Sie auch dieses quickstart of Google Calendar for PHP zu besuchen.

Weitere Informationen finden Sie in der entsprechenden SO-Frage.

+0

Es tut mir leid war ich auf jemand aufgegeben die Post zu beantworten, aber ich habe Ihre Antwort gestern und es hat funktioniert, die Ereignisse zu bekommen, aber jetzt diesen Fehler Ich erhalte die sehr leicht, aber ich finde keine Dokumentation für.

Nachricht: { "Fehler": "invalid_request", "ERROR_DESCRIPTION": "Erforderliche Parameter fehlt: grant_type", "error_uri": ""

@KENdi .. tun Sie etwas über den Parameter wissen .. kann Ich finde keine Dokumentation darüber. Danke für die tolle Antwort. Es war sehr klar – nivanmorgan

Verwandte Themen