Google i el seu Oauth2

Aquesta setmana m’ha tocat lidiar amb la api de google per a un projecte i, la veritat es que m’ha cridat l’atenció el sistema que tenen per autentificar-si i utilitzar els seus serves. Em sembla simplement perfecte. Llastima que la seva documentació no sigui aixi, per lo que vaig a explicar una mica els passos que vaig realitzar per si a algú li serveix d’ajuda.

Abans de continuar, dir que existeix dos maneres d’utilitzar la seva api des de la vostra aplicació php. La primera es utilitzant les classes que google ja te implementades i que us podeu descarregar des de el seu repositori. L’altre es armar-vos de valor i picar el codi a la vostra aplicació utilitzant nomes el que necessiteu.

Personalment recomano que, si teniu temps, li doneu un cop d’ull a les seves classes ja que, encara que la seva documentació es pràcticament nul·la, sempre es descobreixen coses interessants o maneres de fer les coses.

Per desgracia, com a dia d’avui el tems es or, jo he optat per la segona opció que, encara que sembli mes lletja, us pot ajudar a comprendre com funciona realment el sistema.

Posem un exemple per millor comprensió. Diguem que volem posar a la nostra web un boto de login que atacara contra la api de google (ja existeixen codis per la xarxa mes senzills per fer aixo però es nomes un exemple per entendre millor el funcionament de l’api de google). Per a que funcioni correctament, el proces tindria que ser, mes o menys, el següent:

Gràfic del proces de sol·licitud de informació a la api de google

  1. El usuari farà clic en el botó de login per identificar-se en la nostra aplicació web amb un compte de google.
  2. La Nostra aplicació web sol·licitara a la api de google, permís per accedir a les dades del usuari.
  3. La api de google li demanara al usuari permís per a que la nostra web accedí a les seves dades.
  4. Quant l’usuari accepti, la api de google retornara a la nostra web un codi amb el que sol·licitar un token valid.
  5. Amb aquest codi, la nostra aplicació web sol·licitara un token valid per a poder accedir a les dades del usuari.
  6. La api de google retornara un token valid amb el que poder fer consultes
  7. La nostra aplicació web sol·licitara les dades del usuari enviant el token retornat abans.
  8. La api de google retornara les dades del usuari.
  9. I amb aixo finalitzara el proces. En l’imatge lateral es pot veure un gràfic del proces per a una millor comprensió.

Be, després de aquest tocho de text anem al gra. Per poder realitzar l’anterior proces, primer tindreu que registrar la vostra aplicació a google (el proces es mot similar al que s’ha de fer per registrar una aplicació a la api de facebook tot i que google, encara que no ho sembli, no posa tantes traves com facebook a l’hora de registrar una aplicació. A diferencia de facebook, el registre es senzill i no te res d’especial). Com anotació, destacar que es te que posar especial atenció a l’hora de posar la url de callback, per dos motius. El primer es perquè google utilitza aquest camp (a mes de altres) com a camp de seguretat, que es tindrà que passar quan sol·licitem un token valid “si el callback enviat no correspon amb el que tenen ells, us retornaran un error”. El altre motiu es mes obvi i es que serà on retornara la vostra aplicació quan el usuari doni el seu consentiment a la connexió.Proces de registre de la vostra aplicació en la api de google.

Una vegada registrada, necessitarem anotar, a mes del callback que hem posta, el client id i el client secret.

El següent pas es activar els serveis que necessitem de google. Per poder fer aixo tenim que anar a la pestanya serveis. Una vegada dintre, es qüestió d’activar els serveis que volem i ja esta. Per a la majoria dels serves no tindreu problemes però, per alguns en concret (com la api de Blogger) tindreu que omplir un formulari (com si d’una visita al papa de roma es tractes) detallant les vostres intencions (mes que re, dir que sou uns bons minyons i que continuareu sent-ho mentre utilitzeu la api de Blogger), mentre que per altres serveis, tindreu que tirar directament de la MasterCard (com per exemple la api de Maps) si us passeu amb les peticions. El meu consell es que activeu nomes els serveis que necessiteu i us llegiu be les limitacions que tenen cada servei si no voleu tenir sorpreses futures (estan al costat de cada boto d’activació del servei).Llistat de serveis disponibles en la api de google.

També s’ha de tindre en comte que en aquesta llista no apareixen tots els serveis disponibles i es que hi han serveis que ja estan activats per defecte perquè son gratuïts i no tenen cap limitació. Per lo que nomes es necessari afegir-los a la llista de serves que la nostra aplicació utilitzara i ja esta, però m’estic avançant. D’aquest tema en parlarem mes endavant.

Una vegada tinguem registrada la nostra aplicació nomes ens queda programar el proces per obtenir el token i aixi poder fer consultes a la api de google sense tindre que estar contínuament enviant les nostre dades de la aplicació o les nostres dades d’usuari.

Per obtenir aquest token teniu que fer una petició GET a https://accounts.google.com/o/oauth2/auth enviant les següents paràmetres:

Paràmetre Descripció
response_type Indica a google que ha de retornar un codi de autorització. Aquest codi ens serà necessari per poder sol·licitar un token valid. El valor d’aquest paràmetre serà sempre “code”.
client_id El client id de la nostra aplicació. L’hem obtingut abans quan hem registrat la nostra aplicació en google.
redirect_uri La url de callback que hem posat quan vam registrar la nostra aplicació. S’ha de tenir en compte que si no la poseu exactament igual que com l’heu posat quan heu registrat la vostra aplicació en google, aquest se queixara de que la adreça de callback no es valida i no us deixara continuar.
scope Aquesta serà la llista de permisos als que google li demanara permís al usuari per a que la nostra aplicació tingui accés.
La veritat es que aquesta llista pot ser tan extensa com serveis hagem activat quan hem registrar la nostra aplicació però hi han serveis (com per exemple l’accés a les dades de webmastertools) en los que no es necessari que ho activem prèviament.
Per saber com activar cada servei tindreu que buscar a la serva documentació, quin es el seu scope (identificador) del servei i posar-lo en aquesta variable. Per exemple, el servei d’analytics es el scope “https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fanalytics”
state Aquest camp es un string que pot contenir el valor que desitgem. Aquest string, google el retornara en la primera resposta per lo que el podem tractar, per exemple, per si tenim varis logins a google en la nostra web, saber des de quina part de la nostra web ve el usuari per poder redirigir-lo a on ens interessi. Es obligatori posar alguna cosa, no us oblideu.
?Download index.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
<?php
define('CLIENTID','xxxxxxxxxxxx.apps.googleusercontent.com');
define('CLIENTSECRET','xxxxxxxxxxxxxxxxxxxxxxx');
define('URLCALLBACK', 'http://xxxxx.com/googcallback.php');
define('URL','http://xxxxx.com/');
 
if (isset($_GET['error']) && $_GET['error']){
	$error = $_GET['error'];
 
	header('Location: '.URL.'error.php?errorg='.$error);
	die();
} elseif (isset($_GET['code']) && $_GET['code']) {
	$code = $_GET['code'];
 
	header('Location: '.URL.'googcallback.php?code='.$code);
	die();
} else {
	$scope = 'https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fuserinfo.email+';
	$scope .= 'https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fuserinfo.profile+';
	$scope .= 'https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fanalytics.readonly+';
 
	$url = "https://accounts.google.com/o/oauth2/auth?scope=$scope&state=%2Fprofile&redirect_uri=".URLCALLBACK."&response_type=code&client_id=".CLIENTID;
 
	header('Location: '.$url);
	die();
}
?>

Una vegada hageu enviat la sol·licitud a la api de google, si tot ha anat be, us retornarà per GET un codi (en la variable code) amb el que podreu sol·licitar un token. Per sol·licitar el token tindreu que fer una peticion POST
a https://accounts.google.com/o/oauth2/token passant-li els següents paràmetres:

Paràmetre Descripció
code El codi retornat per la trucada anterior. Aquest codi es d’un únic us per lo que si no feu correctament la sol·licitud o aquesta es talla mentre es realitza el proces, tindreu que tornar a sol·licitar un altre codi, començant el proces des de cero.
client_id El mateix client id d’abans.
client_secret El client secret obtingut quan registrem la nostra aplicació.
redirect_uri La url de callback posada en el registre de la aplicació.
grant_type Aquest camp no s’especifica força. Simplement ells comenten que ha de contenir com a valor “authorization_code”

Si tot a anat be, la api ens retornara un fitxer JSON amb el token i altres atributs relacionats amb ell com quin tipus de token és, quan caduca i un identificador d’ell.

Realment, l’important es el token, ja que serà el que necessitarem per realitzar consultes a la api de google. Els altres son mes per si voleu realitzar peticions durant un període llarg de temps (cada token te un temps de vida i quan aquest finalitza, s’ha de tornar a sol·licitar un nou token valid).

Un exemple de codi php de sol·licitud de token seria el següent:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
<?php
define('CLIENTID','xxxxxxxxxxxx.apps.googleusercontent.com');
define('CLIENTSECRET','xxxxxxxxxxxxxxxxxxxxxxx');
define('URLCALLBACK', 'http://xxxxx.com/googcallback.php');
define('URL','http://xxxxx.com/');
 
function request_token($code){
//Sol·licita el token a google amb el codi passat
	$tokendata = array();
 
	$ch = curl_init('https://accounts.google.com/o/oauth2/token');
	curl_setopt($ch, CURLOPT_POST, 1);
	curl_setopt($ch, CURLOPT_POSTFIELDS, "code=".$code."&client_id=".CLIENTID."&client_secret=".CLIENTSECRET."&redirect_uri=".URLCALLBACK."&grant_type=authorization_code");
	curl_setopt($ch, CURLOPT_RETURNTRANSFER , 1); 
	$result_curl = curl_exec($ch);
	$error_curl = curl_error($ch);
	curl_close($ch);
 
	$res = json_decode($result_curl);
 
	if ($res->access_token){
		$tokendata['token_access']=$res->access_token;
	}
	if ($res->token_type){
		$tokendata['token_type']=$res->token_type;
	}
	if ($res->expires_in){
		$tokendata['token_expires_in']=$res->expires_in;
	}
	if ($res->id_token){
		$tokendata['token_id']=$res->id_token;
	}
	return $tokendata;
}
 
$code='';
$param='';
$tokendata = array();
 
if(isset($_GET['code']) && $_GET['code']){
	$code = $_GET['code'];
}
 
if ($code){
	$tokendata = request_token($code);
}
?>

I amb aixo ja tenim tot lo necessari per realitzar sol·licituds a la api de google. S’ha de tenir en compte que totes les respostes de la api de googe son en format JSON pel que us recomano que li doneu un repas a la documentació del servei que aneu a utilitzar per saber tractar les respostes que ens pot donar.

Aquí us deixo un exemple per sol·licitar el correu electrònic del usuari que s’ha identificat en la nostra aplicació amb un compte de google:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<?php
define('TOKENGOOGLE','xxxxxxxxxxxx');
 
function get_userEmail($token){
	$email = '';
 
	$url = 'https://www.googleapis.com/oauth2/v1/userinfo';
	$url .= '?access_token='.$token;
 
	$ch = curl_init($url);
	curl_setopt($ch, CURLOPT_RETURNTRANSFER , 1); 
	$result_curl = curl_exec($ch);
	$error_curl = curl_error($ch);
	curl_close($ch);
 
	$res = json_decode($result_curl);
 
	if ($res->email){
		$email = $res->email;
	}
	return $email;
}
 
$email = get_userEmail(TOKENGOOGLE);
?>

I aixo es tot. Espero haver sigut d’ajuda per a aquells que estan començant en el mon de la api de google. Lo que avui he explicat aquí es nomes la punta del iceberg, ja que es poden arribar a fer coses mol maques. Mica a mica aniré posant mes informació però si algú necessita un cop de ma per resoldre dubtes pot escriure’m i li donaré un cop de ma amb el que pugui.

Deixa un comentari

L'adreça electrònica no es publicarà Els camps necessaris estan marcats amb *