2014-04-12 138 views
0

我正在嘗試製作一些腳本,它會自動添加來自Joomla的事件將新頁面添加到Google日曆中。我用這個代碼做了它,它甚至可以工作,但只有很短的時間。Google api長時間授權

我可能會誤解,Google授權是如何工作的。首先,我必須授權腳本使用該日曆等。我做了一次,但一小時後我不得不再做一次。我想永久授權或至少一年(超過一小時)。我甚至不能在保存過程中對它進行授權,因爲它在保存腳本時會自動重定向到帖子管理。

還有一件事要提到:有一個重定向uri,我把它設置在管理頁面的index.php上。不知道它是一個問題,但它不應該是因爲新聞被添加在index.php中......所以它仍然是一個頁面。

但這一切都工作了一個小時(或周圍的東西),所以我認爲這個問題不是重定向uri。 THX

這裏是我的代碼(由一些谷歌的API,例如網頁粘貼複印件):

 require_once "google-api-php-client/src/Google_Client.php"; 
     require_once "google-api-phpclient/src/contrib/Google_CalendarService.php"; 

     session_start(); 

     $client = new Google_Client(); 
     $client->setApplicationName("Add Google Calendar Entries"); 

     $client->setClientId('####'); 
     $client->setClientSecret('####'); 
     $client->setRedirectUri('####'); 
     $client->setDeveloperKey('####'); 
     $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->getAccessToken()) { 
      $calList = $cal->calendarList->listCalendarList(); 

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

     $event = new Google_Event(); 
     // some calendar adding stuff 

     } else { 
      $authUrl = $client->createAuthUrl(); 
      print "<a class='login' href='$authUrl'>Authorize!</a>"; 
     } 

     // Google Calendar API END 
    } 

只是概括地說:我希望我的授權工作更長的時間,也許有在我的代碼或錯誤在我的理解如何工作。

+0

機器上PHP會話的生命期是多久? (請注意:您可能要考慮使用最新版本的Google API:https://github.com/google/google-api-php-client) – Plenka

+1

這不是它的工作方式,您需要重新授權在令牌到期後。您可能想嘗試在Joomla中使用/擴展JGoogle Api,因爲它可以爲您管理OAuth。 – Elin

回答

1

如果您在請求授權時向用戶請求「離線」訪問,可以獲得長期訪問的關鍵部分。

$client->setAccessType('offline'); 
$authUrl = $client->createAuthUrl(); 

這應該返回一個刷新令牌以及當前會話令牌。你必須保存這個刷新標記。即使他們稍後再次授權應用程序,刷新令牌也不會再次發送。 (並且,如果它們已經被授權,並且在添加脫機訪問後又授予它們授權,有時您將無法獲得刷新令牌。)

然後,您可以執行類似以下的檢查,以使它們保持登錄狀態在:

$client->setAccessToken($site->token); 

if($client->isAccessTokenExpired()) { 
    $NewAccessToken = json_decode($client->getAccessToken()); 
    $client->refreshToken($NewAccessToken->refresh_token); 
} 

最後,我想補充一點,你將需要的accessToken保存到數據庫中,而不是僅僅在會話實際上使它堅持在不同的會話。希望這已經很明顯了。