Autenticación de Tuenti en C#

Feb 4th, 2010 | Posted by Zarovich | Filed under Desarrollo, Social

Lo conseguí!!!. Al fin fui capaz de hacer que mi API de Tuenti, aún muy verde todo sea dicho de paso, sea capaz de realizar la autenticación. Y la verdad es que quedó de lo más mono el método de autenticación.

Lo primero de todo. Este método de autenticación en realidad sirve para practicamente cualquier servicio web que esté expuesto. Por ejemplo para utilizar el servicio GoogleAccount simplemente habría que hacer algo parecido.

Lo importante es que la aplicación sea capaz de recibir el certificado del SSL y después de eso trabajar sobre él, tranquilamente. De todas formas hay una cosa que tuve que activar después de investigar un poco por internet que no acabo de entender muy bien su necesidad.

Como la API la estoy desarrollando para tener compatibilidad con Mono, y la distro mayoritaria actualmente es Ubuntu, y Ubuntu aún tiene la versión 2.4.X de Mono (la 2.6.X salió en Diciembre, así que hasta la 10.4 no cambiaré eso), tuve que prescindir del ServicePointManager.ServerCertificateValidationCallback y en su lugar usar el obsoleto ServicePointManager.CertifyPolicy para poder decirle que certificados debe aceptar y cuales no. Conste que si estás usando .NET 3.0 puedes tranquilamente utilizar el ServerCertificateValidationCallback sin miedo, que funcionará perfectamente. No lo garantizo, pero según he leido si, debería de funcionar.

La implementación del ICertifyPolicy que meto ahí es la siguiente.

class MyCertPolicy : ICertificatePolicy
{
	public bool CheckValidationResult(ServicePoint sp, X509Certificate cert,
      	WebRequest request, int problem)
	{
		return true;
	}
}

Bien, ahora ya aceptaremos cualquier certificado que recibamos en una conexión SSL dentro de nuestra aplicación. Conste que esto no es lo más recomendable, pero en las primeras versiones para ir tirando eso quedará así. Nos fiamos de los chicos de Tuenti.

Luego para decirle que use nuestra política de certificados

ServicePointManager.CertificatePolicy = new MyCertPolicy();
ServicePointManager.Expect100Continue = false;

Parece algo violento todo este cirio, pero es lo que hay. Lo siguiente será configurar la linea que será la que se envíe en el POST al servidor. Esta línea contendrá 4 parámetros, mail, password, timezone, remember; desconozco si el do_login acepta más.

// creating login data
ASCIIEncoding encoding = new ASCIIEncoding();
string userName = this.Mail;
string passwd = this.Passwd;
string timeZone = "1";
string remember = "1";
string postData = "email="+userName+"&input_password="
	+passwd+"&timezone=" + timeZone + "&remember=" + remember;
byte[] data = encoding.GetBytes(postData);

Tras esto habrá que construir la petición que se realizará al servidor, el tipo de petición que se realizará
será a través de HTTP. Así que necesitamos un HTTPWebRequest que apunte al servicio de Tuenti que queremos utilizar, en este caso do_login de Login. Es importante decirle a la petición que estamos haciendo un POST, el tipo de contenido que vamos a enviar en el POST y la longitud de dicho contenido. Y una cosa muy importante, decirle que ignore las redirecciones del servidor. Si al hacer login nos responde con un 302 Found para redireccionarnos, es mejor no hacerle caso, porque en la respuesta 302 está toda la información que necesitamos y no la podemos ignorar.

// login request to tuenti
HttpWebRequest hwr =
	(HttpWebRequest)WebRequest.Create(
	        "http://www.tuenti.com/?m=Login&func=do_login");
Console.WriteLine(hwr.RequestUri.AbsoluteUri);
hwr.Method = "POST";
hwr.ContentType="application/x-www-form-urlencoded";
hwr.ContentLength=data.Length;
Stream newStream = hwr.GetRequestStream();
newStream.Write(data, 0, data.Length);
newStream.Close();
hwr.AllowAutoRedirect = false;

Ahora por último, debemos coger lo que nos interesa de la respuesta 302. La petición de redirección repito que nos da igual. Porque me imagino que el motivo de esto, es que el navegador que estemos utilizando, cuando recibe la 302 guarda las cookies que mandan en esta respuesta, y te manda de nuevo a la pantalla de Login. Al ir a la pantalla de login con las cookies metidas, el navegador las manda y Tuenti automáticamente nos manda a la página de Inicio de nuestro perfil o a la que hayamos intentado acceder sin estar autenticados.

Así que cogemos la cookie que nos interesa, que en concreto es la sid, que es donde están nuestros datos de autenticación y sobretodo el dato más importante, el sid (Session ID), con el Tuenti identificará la sesión abierta.

HttpWebResponse response = (HttpWebResponse) hwr.GetResponse();
string cookieString=response.GetResponseHeader("set-cookie");
this.cookie = new Cookie("sid", cookieString.Substring(4,70));
this.cookie.Expires = DateTime.Parse(cookieString.Substring(84, 29));
this.cookie.Domain = ".tuenti.com";
this.cookie.Path = "/";

Que podemos hacer ahora con esta Cookie, podeis probarlo vosotros mismos a tratar de hacer un HTTPWebRequest a cualquier otra página de Tuenti, mandando esta Cookie. Si todo está bien la página
de respuesta es la pantalla de carga. Ahora bien para evitar toparnos con la pantalla de carga, podemos acceder a servicios tan interesantes, como el que devuelve la página de nuestro perfil directamente.


http://www.tuenti.com/?m=profile&func=my_profile

Proximamente estará subida la primera revisión de Tuenti.NET en el repositorio de Git.
Página de proyecto en Gitorious

Ahí teneis un pequeño esbozo de lo que pretendo conseguir en un principio con esta API. Que conste que avanzará lento, porque estoy a otras cosas.

Bookmark and Share
No comments yet.