2013-08-27 92 views
6

我與谷歌API疼痛持續...與谷歌的API客戶端的PHP刷新令牌

我能使用腳本來使用刷新令牌 - 自動刷新並保持我對活着的壓延機的訪問。我可以與日曆互動,一切都很好。

我現在想繼續使用PHP的谷歌API客戶端,我昨天有這個工作,雖然我的令牌是有效的,但現在這已過期我無法解決如何使用刷新令牌來獲得新的令牌,並在將來到期時繼續進行身份驗證。

我已經找到了一些參考和嘗試這些 - 這是我的測試腳本,到目前爲止基礎上,simple.php例如:

<?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>"; 
} 

與我以前的帖子我不清楚應該是什麼去這裏。我的令牌已過期 - 我有刷新令牌。每次訪問時,我需要對代碼進行哪些更改才能自動刷新授權。

編輯:錯誤代碼是:The OAuth 2.0 access token has expired, and a refresh token is not available

我註釋掉了幾個上面,我想包括在我嘗試更多的線路來解決只是爲了儘量避免混淆進一步

謝謝

回答

10

好的 - 基於一些帖子,我已經解決了獲取刷新令牌以獲取新訪問令牌的問題。我用這個代碼之前,我開始嘗試任何訪問:

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

refreshToken的削除部分是我的刷新令牌。我將密鑰硬編碼到代碼中。

這可能不是正確的解決方案,因爲我已經看到了將密鑰存儲在數據庫中的引用,所以大概我可以將當​​前訪問令牌存儲在帶有刷新令牌的數據庫中,並將這些形式的數據庫需要保存硬編碼嗎?

希望這種方法我用過後會再次工作 - 手指交叉!

+1

你知道一種方法,我可以強制訪問令牌過期,所以我可以測試請求使用刷新令牌的新訪問令牌嗎? – Anagio

+0

我認爲(但不是100%)他們只有3600ms的短時間?我通過在其上進行測試來測試刷新:)我從內存中想到,您可以在您所做的調用中的參數中指定令牌的壽命。我發現很多有用的信息來自oauth playground – Ray

+0

感謝我知道了它,當它過期時我感到困惑,我仍然獲取數據,我的代碼沒有條件來檢查訪問令牌是否過期,或者使用刷新令牌來獲得新的。你的代碼幫助,我得到了它的工作。 – Anagio

相關問題