Oauth2 con le Google api Php Client

In questo articolo mostro un veloce snippet di codice PHP per utilizzare il protocollo OAuth2 per l’autenticazione e autorizzazione all’accesso dei servizi Google.

Si da per scontato l’aver correttamente:

  1. creato un nuovo progetto attraverso la Google Developer Console ed aver richiesto le varie chiavi attraverso il medesimo;
  2. scaricato le librerie Google API – PHP  hostate su gitHub a questo indirizzo.

In questo progetto, per quanto riguarda il punto due, facciamo uso di composer con questo file di configurazione:

{
 "require": {
 "google/apiclient": "1.0.*@beta"
 }
}

 

Partiamo quindi da un nuovo file chiamato index.php ed andiamo a creare la funzione getAuthorizationUrl():

//...
 $client = new Google_Client();
 $client->setClientId(CLIENTID);
 $client->setClientSecret(CLIENTSECRET);
 $client->setApplicationName("calendartest");
 $client->setAccessType('offline');
 $client->setRedirectUri('urn:ietf:wg:oauth:2.0:oob');
 $client->addScope('https://www.googleapis.com/auth/calendar');
//...

Sostituiamo le nostre chiavi ottenute nella console di progetto Google all’interno del nostro codice.

 

Nell’esempio qui riportato, facciamo riferimento ad un progetto con accesso alle API di Google Calendar. Lo scope del progetto sarà sia la lettura che la scrittura all’interno del Calendar. Nel caso si volesse accedere in sola lettura basterà cambiarlo in https://www.googleapis.com/auth/calendar.read.

Il redirect uri determina il modo in cui Google fornirà il codice per la fase di autenticazione e autorizzazione. I valori possibili sono:

  • urn:ietf:wg:oauth:2.0:oob con questa modalità il codice è mostrato in una nuova pagina all’interno di una text box in sola lettura. Anche il titolo della pagina mostrerà tale codice;
  • urn:ietf:wg:oauth:2.0:oob:auto il codice è mostrato nella stessa modalità ma senza alcun messaggio di istruzione verso l’utente;
  • url di redirect, ad esempio http://localhost. In questo caso il codice sarà inserito come parametro get nell’url specificato.

E’ importante che tale valore coincida con quello riportato nella scheda Credenziali del progetto nella Google Developers Console (includendo lo schema http o https. Per maggiori informazioni è possibile visitare questo link Scegliere il parametro redirectURI

 

A questo punto il metodo dovrà controllare in primo luogo la presenza di valori GET all’interno dell’url.

Come primo dato controlliamo l’esistenza del parametro logout . Nel caso in cui lo script sarà richiamato in questo modo http://myurl/index.php?logout, questo dovrà procedere a distruggere la sessione, in modo da far richiedere nuovamente le autorizzazioni del caso.

Nel caso in cui la variabile di Sessione token fosse invece settata, dovrà invece essere utilizzato come token della comunicazione mediante le API Google.

In caso negativo, se all’interno dell’url è passato come GET la variabile codice, si dovrà utilizzare quest’ultimo per autenticare tale valore ed ottenere un nuovo token di autorizzazione. Quest’ultimo sarà salvato all’interno della variabile di sessione token.

if (isset($_GET['logout'])) {
 echo '<br>Sessione distrutta.';
 unset($_SESSION['token']);
 }
if (isset($_SESSION['token'])) {
   echo "<br>token = ";print_r($_SESSION['token']);
   $google_token= json_decode($_SESSION['token']);
   $client->refreshToken($google_token->refresh_token);
 }else if (isset($_GET['code'])) {
   // Exchange authorization code for access token
   echo 'Code set in GET url.';
   $authCode = $_GET['code'];
   $accessToken = $client->authenticate($authCode);
   $client->setAccessToken($accessToken);
   $_SESSION['token'] = $client->getAccessToken();
   echo "token = "; print_r($_SESSION['token']);
 }

Nel caso in cui il token fosse scaduto, procederemo invece all’ottenimento di uno nuovo.

if($client->isAccessTokenExpired()) {
   echo '<br>Access Token Expired<br>'; // Debug
   $authUrl = $client->createAuthUrl();
   print "Please visit: <a href='$authUrl'>$authUrl</a><br>";
   print "Please enter the auth code in the url<br>";
  }

Verrà quindi stampato l’url di autenticazione, attraverso il quale Google ci fornirà il codice per l’ottenimento del token. Tale codice andrà salvato e inserito nell’url in questo modo: “<url>/index.php?code=<codice>“.

L’ ultima condizione da impostare ci consente di controllare l’esistenza del token e, in caso positivo, di effettuare tutte le operazioni di recupero o invio dati verso il nostro servizio Google.

if ($client->getAccessToken()) {
   //doSomething
  }

Questo il codice completo della funzione appena creata:

function getAuthorizationUrl(){
 $client = new Google_Client();
 // OAuth2 client ID and secret can be found in the Google Developers Console.
 $client->setClientId(CLIENTID);
 $client->setClientSecret(CLIENTSECRET);
 $client->setApplicationName("calendartest");
 $client->setAccessType('offline');
 $client->setRedirectUri('urn:ietf:wg:oauth:2.0:oob');
 $client->addScope('https://www.googleapis.com/auth/calendar');

 if (isset($_GET['logout'])) {
 echo '<br>Sessione distrutta.';
 unset($_SESSION['token']);
 }

 if (isset($_SESSION['token'])) {
 echo "<br>token settato = <br>";print_r($_SESSION['token']);
 $google_token= json_decode($_SESSION['token']);
 $client->refreshToken($google_token->refresh_token);
 }else if (isset($_GET['code'])) {
 // Exchange authorization code for access token
 echo '<br>Code set in GET url.';
 $authCode = $_GET['code'];
 $accessToken = $client->authenticate($authCode);
 $client->setAccessToken($accessToken);
 $_SESSION['token'] = $client->getAccessToken();
 }

 if($client->isAccessTokenExpired()) {
 echo '<br>Access Token Expired<br>'; // Debug
 $authUrl = $client->createAuthUrl();
 print "Please visit: <a href='$authUrl'>$authUrl</a><br>";
 print "Please enter the auth code in the url<br>";
 }

 if ($client->getAccessToken()) {
 //do something
 }
 
}

Michele Pierri

Sviluppatore android/web/desktop, blogger, nonchè sostenitore incallito dell'universo Cloud Computing, nel tempo libero amo fare sport e praticare arti marziali.