2015-04-27 46 views
4

我在多個頁面上使用Google API時遇到問題。來自谷歌的Example工作正常,但所有的代碼都在一個頁面上。如何在多個頁面上使用Google API?

我有兩頁。第一頁,用戶點擊登錄按鈕和第二頁,我用谷歌API來拉用戶信息。

第一頁:

<?php 

########## Google Settings.. Client ID, Client Secret from https://cloud.google.com/console ############# 
$google_client_id  = 'myid'; 
$google_client_secret = 'mysecret'; 
$google_redirect_url = 'http://www.myWebsite.com/secondPage.php'; //path to your script 
$google_developer_key = 'mydeveloperkey'; 



//include google api files 
require_once '../includes/Google/autoload.php'; 

//start session 
session_start(); 

$client = new Google_Client(); 
$client->setClientId($google_client_id); 
$client->setClientSecret($google_client_secret); 
$client->setRedirectUri($google_redirect_url); 
$client->addScope("https://www.googleapis.com/auth/drive"); 
$client->addScope("https://www.googleapis.com/auth/calendar"); 
$client->addScope("https://www.googleapis.com/auth/gmail.compose"); 
$client->addScope("https://www.googleapis.com/auth/plus.me"); 



$drive_service = new Google_Service_Drive($client); 
$calendar_service = new Google_Service_Calendar($client); 
$gmail_service = new Google_Service_Gmail($client); 

/************************************************ 
    If we're logging out we just need to clear our 
    local access token in this case 
************************************************/ 
if (isset($_REQUEST['logout'])) { 
    unset($_SESSION['access_token']); 
} 
    // Authenticating the aunthentication URL. and starting session 
if (isset($_GET['code'])) { 
    $client->authenticate($_GET['code']); 
    $_SESSION['access_token'] = $client->getAccessToken(); 
    $redirect = 'http://' . $_SERVER['HTTP_HOST'] . $_SERVER['secondPage.php']; 
    header('Location: ' . filter_var($redirect, FILTER_SANITIZE_URL)); 
} 


/************************************************ 
    If we have an access token, we can make redirect to secondPage.php, else we generate an authentication URL. 
************************************************/ 
if (isset($_SESSION['access_token']) && $_SESSION['access_token']) { 
    header("Location: http://www.myWebsite.com/secondPage.php"); 
    die(); 
} else { 
    $authUrl = $client->createAuthUrl(); 
} 
?> 
<!DOCTYPE html> 
<html lang="en"> 
    <head> 

    </head> 
    <body> 
     <a href="<?php echo $authUrl; ?>"> <img src="images/google-login-button.png" alt="Click to login"></a> 

     </body> 
     </html> 

secondPage.php:

<?php ob_start() ?> 
<?php 

//include google api files 
require_once '../includes/Google/autoload.php'; 

//start session 
session_start(); 

$client = new Google_Client(); 

/************************************************ 
    If we have an access token, we can make 
    requests, else we redirect to firstPage.php. 
************************************************/ 
if (isset($_SESSION['access_token']) && $_SESSION['access_token']) { 
    $client->setAccessToken($_SESSION['access_token']); 
} else { 
    header("Location: http://www.myWebsite.com/firstPage.php"); 
    die(); 
} 
// Rest is HTML 

出於某種原因,如果secondPage.php語句導致成假,else語句被重定向回firstPage.php。

我對編程完全陌生,我很確定我正在做一些沒有意義的事情。讓我知道是否應該添加更多信息。在回答問題時,請嘗試涵蓋以下問題:

  • 是否必須在每個頁面上創建單獨的Google_client對象。
  • 我可以通過從會話變量設置access_token來創建Google_client對象。
  • 我應該如何劃分代碼,以便在firstPage.php上只有一個登錄按鈕,並且所有其他頁面都可以使用access_token來使用Google服務。
  • 會有其他網頁,我會使用googleapi以外的其他網頁firstPage.php和secondPage.php。
+0

你確定,'$ client-> getAccessToken()'正在返回你的值,可能會被解釋爲'true'? – yergo

+0

是的,它返回值。 Google提供的示例中也使用了此方法。 –

回答

0

1.重定向正確

我有關於該行有些疑惑:

$redirect = 'http://' . $_SERVER['HTTP_HOST'] . $_SERVER['secondPage.php']; 

這是因爲我敢肯定,你什麼也沒有設置背後$_SERVER['secondPage.php']變量。您應該修復此問題以重定向至secondPage.php,之後不需要第一頁中的更多代碼。

2.設置accont在secondPage.php

在你的第一個腳本,你有這樣的臺詞:

$client = new Google_Client(); 
$client->setClientId($google_client_id); 
$client->setClientSecret($google_client_secret); 
$client->setRedirectUri($google_redirect_url); 

,你們已經在secondPage.php中省略他們。這可能是您的第二個腳本無法正常工作的原因,因爲您的腳本不知道它正在使用哪個帳戶。您必須在第二個腳本中再次配置腳本,就像您在第一個腳本中一樣。也就目前而言,我會切斷ob_start(),這可能會加劇調試。

我更喜歡你再次仔細閱讀穀倉存儲庫上的示例。這是相當自我解釋性的,它只是要求你一遍又一遍地閱讀它,只要你會有那種奇怪的小感覺......我可以向你保證,你可以在三個文件中輕鬆完成:第一個爲::authenticate()並設置$_SESSION,第二個爲::setAccessToken()並全部休息,第三個與前面兩個設置的所有$client類一起使用。

+0

它幫助你Sandeep嗎? – Nevermore

相關問題