Programador PHP freelance

Login en Drupal mediante redes sociales con HybridAuth

Existen varios formas de integrar el login mediante redes sociales en Drupal 7 pero después de analizar unas cuantas me quedo con la que integra HybridAuth.

 

HybridAuth es una librería PHP que hace de wrapper o envoltorio de las APIs de la gran mayoría de redes sociales, entre ellas las más famosas, como Twitter, Facebook, Linkedin,…

Nos permite acceder a los perfiles de usuario, listado de amigos, activity, publicación de contenidos,… y por ente la posibilidad de que el usuario haga login mediante la red social. Esto nos abstrae y agiliza el desarrollo, sobretodo si vamos a atacar varias plataformas.

 

En el caso que me ocupaba esta vez, necesitaba integrar el login con redes de Facebook, Twitter i Linkedin. El módulo es bastante sencillo de configurar, siendo más costoso definir las apps en las respectivas redes que la propia configuración en Drupal. Una vez logado, el módulo de Drupal utilizaba parte de la información del perfil facilitado por HybridAuth para cargar esa información en el perfil del usuario Drupal a crear. En concreto, el portal Drupal utiliza unas imágenes bastante grandes para el perfil, lo cual era un problema tanto en Twitter como en Linkedin ya que las imágenes facilitadas por defecto son miniaturas, de dimensiones reducidas, que al ser importadas quedaban pixeladas.

Buceando un poco en el código se puede descartar que sea un problema del módulo. Este hace su trabajo. Ante una petición de login, pasa la llamada a la libreria de HybridAuth y esta se encarga de hablar con la API correspondiente y recuperar la info del perfil del usuario.

En el caso concreto de Twitter, dentro de Hybrid/Providers/Twitter.php, podemos encontrarnos con el método responsable de recuperar la imagen de perfil. El método es getUserProfile() y dentro de él podemos detectar fácilmente donde se recupera la susodicha

$this->user->profile->photoURL    = (property_exists($response,’profile_image_url’))?$response->profile_image_url:””;

 

Preguntando al todopoderoso Google nos encontramos con que existe la posibilidad de recuperar la imagen original simplemente modificando la URL que nos devuelve el API de Twitter.

Aquí tenéis la URL original que apunta a la versión por defecto que devuelve Twitter.

http://pbs.twimg.com/profile_images/330029542/avatar_normal.jpg

Si eliminamos el sufijo ‘_normal’ pasamos a tener la imagen original

http://pbs.twimg.com/profile_images/330029542/avatar.jpg

Con esto, podemos modificar la línea que comentaba más arriba para forzar a la librería a recuperar la imagen original.

$this->user->profile->photoURL    = (property_exists($response,’profile_image_url’))?str_replace(‘_normal’, ”, $response->profile_image_url):””;

 

El caso de Linkedin es un poco diferente. Debemos de modificar la llamada a la API para pedirle que nos envíe la imagen original. Aquí tenéis la llamada original y la modificada:

$response = $this->api->profile(‘~:(id,first-name,last-name,public-profile-url,picture-url,email-address,date-of-birth,phone-numbers,summary)’);

$response = $this->api->profile(‘~:(id,first-name,last-name,public-profile-url,picture-url,picture-urls::(original),email-address,date-of-birth,phone-numbers,summary)’);

y posteriormente tratar la respuesta para aislar dicha imagen. Aquí os pego el código original y el modificado:

$this->user->profile->photoURL    = (string) $data->{‘picture-url’};

 

if( $data->{‘picture-urls’} && $data->{‘picture-urls’}->{‘picture-url’} ){
$photoURL = (array) $data->{‘picture-urls’}->{‘picture-url’};
$this->user->profile->photoURL = (string) $photoURL[0];
}
else{
$this->user->profile->photoURL = (string) $data->{‘picture-url’};
}

 

Un apunte final… Para jugar con las diferentes APIs podéis utilizar la consola de Apigee. Lleva implementada el API de las principales redes sociales lo cual os resultará muy cómodo a la hora de localizar las llamadas o testear de forma rápida la respuesta. Priceless.