2015-11-24 21 views
5

Sto utilizzando il client API di Google per leggere le email da Gmail. Ora voglio aggiungere un cronjob in modo che legga ogni 5 minuti le mail.Client API Google e Cronjob

Il problema che si verifica utilizzando il client dell'API di Google è che deve consentire all'utente di fare prima clic sul collegamento di autorizzazione e consentire all'utente di utilizzare il client dell'API di Google.

Ho una casella di posta di classe con una funzione di inizializzazione che avvia il client dell'API di Google. Ma il cronjob non funziona perché devo ottenere un 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)); 
} 

Ragazzi sapete come risolverlo utilizzando il token di aggiornamento o qualsiasi altra cosa? Non riesco a farlo funzionare e sono fuori di idee.

Se io sono l'accesso l'URL e cliccare su "Clicca qui" e permettere che funziona con successo, ma non con un cronjob perché non posso cliccare sull'URL "clicca qui" ...

spero voi lo capite e potete aiutarmi :).

Cordiali saluti,
Yanick

risposta

3

Questa risposta è più un orientamento generale su come utilizzare il flusso di O-Auth2, dal momento che di fronte a un problema simile qualche tempo fa. Spero che ti aiuti un po '.

Un possibile problema (nel comprendere l'uso corretto di OAuth) è che si utilizza force come richiesta di approvazione. Perché costringi l'utente a dare il permesso quando lo ha già fatto?

Quando un utente esegue l'autenticazione contro il proprio back-end, gli viene chiesto se desidera autorizzare la propria applicazione alle azioni definite in scope. La prima volta che l'applicazione ottiene queste autorizzazioni (facendo clic sul pulsante "Accetto"), lo script riceverà access_token e refresh_token da google.

Il access_token viene utilizzato per accedere alle API di Google con l'account di tale utente autenticato. Dovresti memorizzarlo da qualche parte sul tuo server se desideri accedere alle API di google senza che l'utente sia presente (cosiddetto accesso offline). Con questo token puoi fare qualsiasi cosa nel nome dell'utente (limitato agli ambiti definiti). Non sarà più valido dopo 1 ora circa. In tutto il tempo (di 1 ora) puoi usare questo token senza che l'utente sia presente!

Il refresh_token è necessario quando le spose access_token non sono valide dopo questo periodo di tempo. E solo allora. Si ottiene solo il refresh_tokenONCE e non cambierà mai. Questo è un dato molto importante e dovrebbe essere conservato in sicurezza!

Quindi, se si desidera accedere a Google API senza la presenza dell'utente, è necessario effettuare chiamate API con lo access_token memorizzato. Se la risposta è qualcosa come token expired (penso che ci fosse un codice di errore per quello - fare ricerca), quindi si chiama $client->refreshToken($refreshToken) con il token di aggiornamento che hai archiviato in un posto sicuro. Otterrai un nuovo access_token da quello. Con questo access_token puoi lavorare ulteriormente, senza che l'utente debba cliccare da qualche parte (di nuovo).

La prossima volta che il nuovo access_token wents valido, è necessario utilizzare lo stesso refresh_token come prima e questo è il motivo per cui questo refresh_token è così importante.

Spero di poterti aiutare un po '. In caso contrario, si prega di commentare questo.

felice di codifica

Risorse

Problemi correlati