2013-08-27 24 views
6

Mój ból z google api trwa ...odświeżania żeton z google api klienta php

jestem w stanie użyć skryptu do korzystania z tokena odświeżania - automatyczne odświeżanie i zachować mój dostęp do kalendarza żyje. Mogę wchodzić w interakcje z kalendarzem i wszystko jest w porządku.

Teraz chcę przejść do korzystania z klienta Google Api dla php, a ja działałem wczoraj, podczas gdy mój token był ważny, ale teraz to się już nie udało Nie mogę się dowiedzieć, jak użyć odświeżającego tokena, aby uzyskać nowy token i zachować uwierzytelnianie, gdy wygasa w przyszłości.

Znalazłem wiele odniesień i próbował nich - oto mój skrypt testowy do tej pory na podstawie simple.php przykład:

<?php 
require_once '../../src/Google_Client.php'; 
require_once '../../src/contrib/Google_CalendarService.php'; 
session_start(); 

$client = new Google_Client(); 
$client->setAccessType('offline'); 
$client->setApplicationName("Downs Golfmanager"); 


// Visit https://code.google.com/apis/console?api=calendar to generate your 
// client id, client secret, and to register your redirect uri. 
$client->setClientId('XXXXXX.apps.googleusercontent.com'); 
$client->setClientSecret('XXXXXX'); 
$client->setRedirectUri('XXXXXX'); 
$client->setDeveloperKey('XXXXXX'); 
$client->refreshToken('X/XXXXX'); 


$client->setUseObjects(true); 
$cal = new Google_CalendarService($client); 
if (isset($_GET['logout'])) { 
    unset($_SESSION['token']); 
} 

if (isset($_GET['code'])) { 
    $client->authenticate($_GET['code']); 
    $_SESSION['token'] = $client->getAccessToken(); 
    header('Location: http://' . $_SERVER['HTTP_HOST'] . $_SERVER['PHP_SELF']); 
} 

if (isset($_SESSION['token'])) { 
    $client->setAccessToken($_SESSION['token']); 
} 

if($client->isAccessTokenExpired()) { 
    /
    echo 'Access Token Expired'; // Debug 
    //$client->refreshToken($refreshToken); 
} 

if ($client->getAccessToken()) { 

    $event = new Google_Event(); 

    $event->setSummary('Appointment'); 
    $event->setLocation('Somewhere'); 

    $start = new Google_EventDateTime(); 
    $start->setDateTime('2013-08-28T14:00:00.000+01:00'); 
    $event->setStart($start); 

    $end = new Google_EventDateTime(); 
    $end->setDateTime('2013-08-28T15:25:00.000+01:00'); 
    $event->setEnd($end); 

    $createdEvent = $cal->events->insert('[email protected]', $event); 

    //echo "<pre>" . print_r($createdEvent, true) . "</pre>"; 
    echo $createdEvent->getId(); 


    //test pulling events 
    $events = $cal->events->listEvents('[email protected]'); 

    while(true) { 
     foreach ($events->getItems() as $event) { 
     echo $event->getSummary(); 
     } 
     $pageToken = $events->getNextPageToken(); 
     if ($pageToken) { 
     $optParams = array(
      'pageToken' => $pageToken, 
      'timeMin'=>'2013-08-26T00:00:00+01:00', 
      'timeMax'=>'2013-08-31T00:00:00+01:00' 
      ); 
     $events = $cal->events->listEvents('[email protected]', $optParams); 
     } else { 
     break; 
     } 
    } 
    //print "<h1>Events List</h1><pre>" . print_r($events, true) . "</pre>"; 



    $calList = $cal->calendarList->listCalendarList(); 
    print "<h1>Calendar List</h1><pre>" . print_r($calList, true) . "</pre>"; 


$_SESSION['token'] = $client->getAccessToken(); 
} else { 
    $authUrl = $client->createAuthUrl(); 
    print "<a class='login' href='$authUrl'>Connect Me!</a>"; 
} 

Jak z moich poprzednich postów Nie jestem jasne, co powinno być dzieje się tutaj. Mój token wygasł - mam token odświeżania. jakie zmiany w moim kodzie są potrzebne, aby automatycznie odświeżać autoryzację za każdym razem, gdy uzyskuję dostęp.

Edycja: Kod błędu: The OAuth 2.0 access token has expired, and a refresh token is not available

Mam wypowiedziało się kilka dodatkowych linii, powyżej której ja zawartych w moich próbach rozwiązania po prostu spróbować i uniknąć mylące dalej

Dziękuję

Odpowiedz

10

OK - Na podstawie kilku postów naprawiłem problem z odświeżeniem tokena, aby uzyskać nowy token dostępu. Kiedyś ten kod zanim zacząłem próbować dostępu:

if($client->isAccessTokenExpired()) { 
    echo 'Access Token Expired'; // Debug 
    $client->refreshToken('X/XXXXXX'); 
} 

Jeżeli wygaszone część w refreshToken jest mój token odświeżania. Ciężko zakodowałem klucz do kodu.

To prawdopodobnie nie jest poprawne rozwiązanie, ponieważ widziałem odniesienia do przechowywania klucza w bazie danych, więc prawdopodobnie mógłbym przechowywać bieżący token dostępu w bazie danych przy użyciu odświeżającego tokena i pobrać te dane z db jako i wymagane, aby zapisać je na sztywno?

Mam nadzieję, że ta metoda, z której korzystałem, zadziała ponownie po jej wygaśnięciu - palce!

+1

Czy znasz sposób, w jaki mogę wymusić wygaśnięcie tokenu dostępu, aby przetestować żądanie nowego tokena dostępu z tokenem odświeżania? – Anagio

+0

Myślę (ale nie w 100%), że mają tylko krótką skalę czasową 3600ms? Przetestowałem odświeżenie przez sleeoing na nim :) Myślę, że z menmory możesz określić żywotność tokena w parametrach w wywołaniu, które wykonujesz. Znalazłem wiele użytecznych informacji z gry na oauth plac zabaw – Ray

+0

dzięki, że to zorientowałem się, byłem zdezorientowany, gdy wygasł i wciąż otrzymywałem dane, mój kod nie miał warunku do sprawdzenia, czy token dostępu wygasł, lub aby uzyskać nowy za pomocą odświeżającego tokena. Twój kod pomógł, udało mi się. – Anagio

Powiązane problemy