blog del equipo de tecnología de 11870.com

11870.com API 101 (con Python): autenticación

Si bien tenemos la documentación de nuestra API bastante limpia y al día, algo de certeza hay en eso de que tiene una curva de aprendizaje un tanto pronunciada dependiendo de lo que queramos hacer. En este primer post vamos a dar una vuelta rápida por alguna de las funcionalidades que se ofrecen usando el lenguaje de programación Python (con las librerías httplib2 y feedparser), aunque en realidad lo que aquí se explica es fácilmente portable a otros lenguajes de programación.

Esta entrada forma parte de una serie (11870.com API uanou uan) que intenta dar una visión más práctica de nuestra API. La documentación relevante a seguir es API authentication.

Obteniendo una API key

Lo primero que querremos hacer será generar una nueva API key. Para ello nos vamos a 11870.com/usuario/apps/new con nuestro navegador y rellenamos el formulario (importante la sección de notas, que nos gusta saber para qué se nos utiliza). Como resultado obtendremos dos cosas:

  • una clave de aplicación (API key) o appToken
  • un secreto asociado a esa clave de aplicación
Obtención de la API key

Tenemos dos formas de autenticar nuestras peticiones dependiendo de si sólo vamos a usar sólo las funcionalidades de búsqueda o todas.

Las peticiones de búsqueda requieren que se añadan dos parámetros adicionales para ser autenticadas: appToken y authSign. Los valores de estos parámetros son estáticos (cosa que cambiará en una futura revisión de la API) y en el caso del appToken es la misma clave de aplicación obtenida anteriormente mientras que authSign es un hash que se calcula haciendo el md5 de la clave de aplicación seguido del secreto concatenado. Para calcularlo:

>>> from hashlib import md5
>>> md5(appToken + secret).hexdigest()
'f688ae26e9cfa3ba6235477831d5122e'
>>>

Si preferimos hacerlo en shell:

$ echo -n ${APPTOKEN}${SECRET}|md5sum
f688ae26e9cfa3ba6235477831d5122e  -
$

Con esto ya podemos lanzar la primera query de búsqueda:

>>> import httplib2
>>> h = httplib2.Http()
>>> request, content = h.request("http://11870.com/api/v1/search?q=mudanzas&appToken=" + appToken + "&authSign=" + authSign)

Con las consultas de búsqueda, es muy cómodo trabajar con feedparser, que trata nuestras respuestas perfectamente:

>>> import feedparser
>>> feed = feedparser.parse(content)

A partir de ahora, la navegación del objeto feed es coser y cantar. Por otro lado, si nos sigue gustando el shell, hay para todos los gustos:

$ curl "http://11870.com/api/v1/search?q=mudanzas&appToken=${APPTOKEN}&authSign=${AUTHSIGN}"

En cuyo caso obtendremos el XML de resultado a pelo.

Hasta aquí digamos que nuestra API no ha mostrado lo áspera que puede llegar a ser (eso sí, sólo las primeras veces ;). Como pronto vamos a empezar a realizar ya peticiones de manejo de agenda, necesitaremos autorizar a nuestra aplicación para que la gestione. Para hacerlo a mano tenemos que ir a la siguiente URL:

http://11870.com/manage-api/create-token?appToken=APPTOKEN&authSign=AUTHSIGN&privilege=WRITE&returnUrl=http://www.google.es”

estando ya autenticados en 11870.com. Veremos que se nos solicita conceder autorización a la aplicación para manejar nuestros sitios (y también contactos e información de perfil). Al hacerlo, nos iremos a una página de resultados de google y de ahí tendremos que coger el authToken.

atb

Esto último suena un poco raro, lo que ocurre por debajo es que 11870.com redirige a la URL que hayamos puesto en en el parámetro returnUrl añadiendo un parámetro adicional que es authToken con el valor que nos interesa. Este parámetro es parecido a una contraseña, ya que está vinculada a nuestro usuario y aplicación.

A partir de ahora podremos autenticar las peticiones que hagamos usando el esquema de autenticación WSSE. Como usuario utilizaremos el email del usuario y como contraseña el authToken que acabamos de obtener:

>>> h.add_credentials("luis@11870.com", authToken)
>>> request, content = h.request("http://11870.com/api/v1/search?q=bares")
>>>

Conclusiones

Tres cosas deberían quedar claras después de leer este artículo:

  • cómo generamos una nueva clave de aplicación y somos capaces de obtener el valor de authSign
  • que hay dos formas de realizar peticiones contra la API: o añadiendo parámetros a la query (si sólo usamos la búsqueda) o usando WSSE (si queremos poder gestionar datos del usuario)
  • cómo autorizar a nuestra aplicación para que acceda a la agenda de un usuario

En próximos capítulos de la serie (dejadme que lo vuelva a decir: 11870.com API uanou uan) veremos cómo gestionar la agenda de un usuario, sus contactos, sus datos de perfil y acceder a su actividad social.

Tags: , , , , ,

3 comentarios

rssComments RSS transmitTrackBack Identifier URI


Hola Luis,

Un artículo muy interesante :) Por aquí estamos empezando a trabajar en un arquitectura similar para las APIs internas.

¿Habeis valorado otros sistema de autenticación para APIs como OAuth?

Respecto a la documentación de la API. ¿Cómo la generais? ¿Automaticamente?
En Java, si usas Jersey, puedes generarla mediante XSL a partir del WADL de descripción del servicio …

Salut,
Ricardo

Comentario by Ricardo on septiembre 1, 2009 2:33 pm


Hola Ricardo,

OAuth no existía (en público) cuando nosotros lanzamos la API, así que montamos un esquema con un aire parecido. Si te das cuenta, casi que el primer precursor de OAuth lo tenía montado flickr! con su API y fue la que intentamos tomar como referencia. En un futuro soportaremos OAuth.

La API, aunque todavía no lo hayamos visto en este uanou uan, está implementada sobre el Atom Publishing Protocol (ahora RFC) y para eso nos apoyamos en Abdera en el lado del servidor. Así que la documentación la hacemos con mucho cariño ;)

Comentario by peralta on septiembre 2, 2009 8:54 am


Genial.

Igual ya lo has visto, pero ahora Jersey se integra con Abdera:

http://download.java.net/maven/2/com/sun/jersey/contribs/jersey-atom-abdera/

De esta forma podriais solucionar el tema de la generación automática de la docu a partir del WADL …

Salut,
Ricardo

Comentario by Ricardo on septiembre 4, 2009 5:48 pm

addDeja un comentario