Autenticazione Google OAuth2 in PHP

Come integrare il login Google OAuth2 nelle nostre applicazioni web PHP. Si tratta del login Google che può essere selezionato al posto della normale registrazione tramite email e password.

 

sign_up_with_google_button-60e629008d4a889a84cf284b08a9998b

 

Molto più pratico di una registrazione normale, l’utente non deve scegliere una password o inserire dati particolari: l’unica cosa che deve fare è dare il consenso all’applicazione web per l’utilizzo dei suoi dati personali (di solito nome, email e foto profilo, mai la password).

Nelle normali registrazioni l’utente deve inserire un nome utente ed una password, questi dati vengono memorizzati dall’applicazione web e sono richiesti durante il login.

Con OAuth2 l’utente non deve fare nulla di tutto ciò: è sufficiente autorizzare l’applicazione web una volta e automaticamente otterrà l’accesso.

Il protocollo OAuth2 è disponibile anche per molti altri social network:

 

social-login

 

Il funzionamento è abbastanza semplice: l’utente clicca sul bottone “Log in con Google” e viene portato alla pagina di autorizzazione. Se l’utente approva il sito riceve un codice di autorizzazione. Questo codice di autorizzazione viene poi usato dall’applicazione stessa per richiedere il token di accesso tramite il server OAuth2 Google. Il token può essere usato dal sito stesso per recuperare i dati utente direttamente dal server Google (nome, email, foto profilo etc…).

 

webflow

 

Possiamo quindi memorizzare il token in un cookie e i dati utente (e in particolare l’id utente) nel nostro database: quando l’utente si ricollegherà useremo il cookie per recuperare di nuvo l’id utente tramite apposita API. Se l’id utente corrisponde a quello memorizzato nel database significa che l’utente si era già registrato.

Vediamo allora come integrare il login OAuth2 in una applicazione web PHP.

Il nostro script PHP ha bisogno di alcune credenziali per accedere al server OAuth2 di Google. Per prima cosa quindi occorre creare tali credenziali dalla Google Developer Console.

Setup credenziali OAuth2

Apriamo la sezione su Google+ API e generiamo un nuovo set di credenziali:

 

Screen shot 2015-11-15 at 12.28.32 PM

 

Dobbiamo inserire un nome di riferimento (ad esempio “OAuth2 per il mio sito web”) e il redirect url che sarà l’URL al quale l’utente ritornerà automaticamente non appena avrà dato il consenso sul form di login Google.

Per far funzionare il nostro script di esempio dovremo puntare il redirect URL direttamente alla URL dove abbiamo caricarto lo script (lo script di esempio non funziona in locale!).

 

Screen shot 2015-11-15 at 12.35.34 PM

 

Annotiamoci il Client ID e il Client Secret.

Script di esempio per login Google Oauth2 in PHP

Lo script è veramente semplice. Si compone di un singolo file “googleauth.php” che contiene il codice di login vero e proprio e una cartella “Google” che contiene la libreria OAuth2 Google.

Per prima cosa includiamo la libreria OAuth2 e settiamo le credenziali generate sul Google Developer Console:

 

session_start();
require_once ('Google/autoload.php');

$client_id = 'XXXXXXXXXXXXXXXXX';
$client_secret = 'XXXXXXXXXXXXXXXX';
$redirect_uri = 'redirect url';

Creiamo ora l’oggetto Google_Client() e passiamo le credenziali $client_id e $client_secret più il nostro URL redirect.

 

// Creiamo il Google client
$client = new Google_Client();
$client->setClientId($client_id);
$client->setClientSecret($client_secret);
$client->setRedirectUri($redirect_uri);
$client->addScope("email");
$client->addScope("profile");

Il Google_client() è il client grazie al quale comunichiamo con le Google API.

Creiamo ora l’instanza Google_Service_Oauth2(). Questo oggetto è l’interfaccia vera e propria per il protocollo OAuth2.

 

// Creiamo l'interfaccia API OAuth2
$service = new Google_Service_Oauth2($client);

Settiamo ora la callback con la quale il nostro script riceverà il codice di autorizzazione dal server OAuth2 di Google. Questo codice è invocato automaticamente dalla pagine di autorizzazione di Google quando l’utente accetta l’autorizzazione. Il nostro URL redirect deve puntare a questa porzione di codice. Nel nostro caso abbiamo messo questo codice direttamente nel file “googleauth.php” quindi l’URL redirect deve puntare al file “googleauth.php” stesso. Nulla vieta comunque di avere questa callback in un altro script PHP a parte.

Lo script legge il codice di autorizzazione inviato in GET dal server Google e richiede il token vero e proprio. Poi salva il token nella sessione PHP corrente (volendo potremmo anche salvarlo in un cookie).

 

// Callback per il servizio OAuth2 di Google.
// Salviamo il token nella sessione PHP e ricarichiamo la pagina
if(isset($_GET['code']))
{
 $client->authenticate($_GET['code']);
 $_SESSION['access_token'] = $client->getAccessToken();
 header('Location: '.$_SERVER['PHP_SELF']);
 exit;
}

Definiamo un modo per effettuare il logout. Questa porzione di codice semplicemente cancella il token dalla sessione PHP corrente. E’ sufficiente chiamare lo script settando la variabile GET “logout=” (i.e. “googleauth.php?logout=”).

Lo script ora si dirama in due direzioni differenti. Se il token è presente in sessione vengono recuperati i dati utente direttamente dal server Google. Altrimenti si provvede a mostrare una pagina di login col classico bottone rosso “Log in tramite Google”:

 

// L'utente è già loggato oppure no?
if(isset($_SESSION['access_token']) && $_SESSION['access_token'])
{
	// Si, l'utente è loggato, recuperiamo i dati dell'utente
	
	$client->setAccessToken($_SESSION['access_token']);
	$user = $service->userinfo->get();
	
	echo "Benvenuto ".$user->name."!";
	echo "User ID = ".$user->id;
	echo "Email = ".$user->email;
	echo "Google page = ".$user->link;
	echo "Avatar = ".$user->picture;
	echo "";
	echo "<a href='?logout='>Esci</a>";
}
else
{	
	// No, l'utente non è loggato, mostriamo la pagina di login

	$authUrl = $client->createAuthUrl();
	
	echo '<div align="center">';
	echo '<h3>Login</h3>';
	echo '<a class="login" href="' . $authUrl . '">';
echo '<img src="signin.png" /></a>';
}

Se il token è settato prendiamo i dettagli utente invocando $service->userinfo->get().

Se non è settato creiamo il link per andare alla pagina di autorizzazione Google. Il link viene creato con la API createAuthUrl().

Trovate lo script di esempio completo di libreria GoogleAPI su GitHub.

Posted in Software and tagged , , .
Gianluca

Gianluca

Leave a Reply

avatar
wpDiscuz