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.
irenusky says
Gracias por compartir tus conocimientos!
Una pregunta. Se podría loguear uno con los datos de Drupal 6 en una web de WordPress?
Gracias.
admin says
Hola,
existe un plugin que te permite logear usuarios desde una base de datos externa. http://wordpress.org/plugins/external-database-authentication/
Por otro lado, puedes programar una migración periódica, si no necesitas inmediatez o un script de sincronización cada vez que se produzca un alta o un cambio en las credenciales de los usuarios.
Suerte
Carlos says
Amigo tengo una pregunta, a mi me da un errer de
HTTP error 500 al utilizarlo
vigoncas says
Te aconsejo que tires de la comunidad Drupal. Es muy activa y ayudan mucho 😉