2015-11-24 213 views
5

我正在使用Google API客戶端從Gmail中讀取電子郵件。現在我想添加一個Cronjob,以便每5分鐘閱讀一次郵件。Google API客戶端和Cronjob

使用Google API客戶端的問題在於,它需要允許用戶先單擊授權鏈接並允許用戶使用Google API客戶端。

我有一個具有函數初始化類的收件箱,用於初始化Google API客戶端。但是cronjob不起作用,因爲我必須得到一個access_token。

public function initialize() { 
    $configuration = Configuration::getConfiguration('class_Inbox'); 

    // Creates the Google Client 
    $this->client = new Google_Client(); 
    $this->client->setApplicationName('Tiptsernetwork'); 
    $this->client->setClientId($configuration['clientId']); 
    $this->client->setClientSecret($configuration['clientSecret']); 
    $this->client->setRedirectUri('http://www.tipsternetwork.nl/cronjob/authenticate'); 
    $this->client->addScope('https://mail.google.com/'); 
    $this->client->setApprovalPrompt('force'); 
    $this->client->setAccessType('offline'); 

    // Creates the Google Gmail Service 
    $this->service = new Google_Service_Gmail($this->client); 

    // Authenticates the user. 
    if (isset($_GET['code'])) { 
     $this->authenticate($_GET['code']); 
    } 

    // Check if we have an access token in the session 
    if (isset($_SESSION['access_token'])) { 
     $this->client->setAccessToken($_SESSION['access_token']); 
    } else { 
     $loginUrl = $this->client->createAuthUrl(); 
     echo '<a href="'.$loginUrl.'">Click Here</a>'; 
    } 

    // If the token is expired it used the refresh token to generate a new Access Token 
    if($this->client->isAccessTokenExpired()) { 
     $this->client->refreshToken($configuration['refreshToken']); 
    } 
} 

public function authenticate($code) { 
    // Creates and sets the Google Authorization Code 
    $this->client->authenticate($code); 
    $_SESSION['access_token'] = $this->client->getAccessToken(); 

    $this->client->refreshToken($configuration['refreshToken']); 

    // Redirect the user back after authorizaton 
    $url = 'http://' . $_SERVER['HTTP_HOST'] . $_SERVER['PHP_SELF']; 
    header('Location: ' . filter_var($url, FILTER_VALIDATE_URL)); 
} 

你們是否知道如何使用刷新令牌或任何解決它?我無法做到這一點,並且我沒有想法。

如果我訪問的網址,然後點擊「點擊這裏」,並允許其它的作品成功地但不是一個cronjob,因爲我不能點擊「點擊這裏」網址...

希望你們瞭解它並可以幫助我:)。

親切的問候,
Yanick

回答

3

這個答案是更多的一般方法如何使用O型Auth2流量,因爲我前一段時間面臨着類似的問題。我希望這會有所幫助。

一個可能的問題(在瞭解正確使用OAuth時)是您使用force作爲批准提示。你爲什麼強迫用戶在他已經做的時候給予許可?

當用戶對您的後端進行身份驗證時,系統會詢問他是否希望爲您的應用程序授予在scope中定義的操作權限。當您的應用第一次獲得此權限時(用戶點擊「同意」按鈕),您的腳本將從谷歌獲得access_tokenrefresh_token

access_token用於使用該認證用戶的帳戶訪問Google-API。如果你想訪問google API而不需要用戶在場(所謂的離線訪問),你應該將其存儲在服務器的某個地方。使用此令牌,您可以以用戶的名義進行任何操作(僅限於定義的範圍)。它會在1小時左右後失效。在整個(1小時)的時間內,您可以使用此令牌而不需要用戶在場!

access_token在這段時間後無效,需要refresh_token。只有那樣。你只能得到refresh_token一次它永遠不會改變。這是非常重要的數據,應該安全存儲!

所以,如果你想訪問谷歌API沒有用戶的存在,你必須使用存儲的access_token API調用。如果響應類似token expired(我認爲有一個錯誤代碼 - 必須進行研究),那麼您可以撥打$client->refreshToken($refreshToken)並將刷新標記存儲在安全的地方。你會從中得到一個新的access_token。有了這個access_token你可以做更多的工作,而不需要用戶再次點擊某個地方。

下一次新的access_token wents無效,你必須像以前一樣使用相同的refresh_token,這就是爲什麼這refresh_token如此重要的原因。

我希望我可以幫你一點點。如果沒有,請對此評論。

快樂編碼

資源