{"id":2344,"date":"2017-05-24T11:12:40","date_gmt":"2017-05-24T09:12:40","guid":{"rendered":"https:\/\/inlab.fib.upc.edu\/?p=2344"},"modified":"2017-05-24T11:12:40","modified_gmt":"2017-05-24T09:12:40","slug":"desenvolupant-la-api-de-la-fib-20-2","status":"publish","type":"post","link":"https:\/\/inlab.fib.upc.edu\/es\/uncategorized-ca\/desenvolupant-la-api-de-la-fib-20-2","title":{"rendered":"Desarrollando la API de la FIB 2.0"},"content":{"rendered":"<p dir=\"ltr\">Este 2016 desde el inLab hemos desarrollado una nueva API para la FIB. El objetivo del proyecto era dar, de forma estructurada, la informaci&oacute;n publica de la FIB. Como da m&aacute;s informaci&oacute;n que la anterior versi&oacute;n, hemos decidido que era hora de desvincularla del &quot;Rac&oacute;&quot; y darle la importancia que se merece. Os presentamos pues la nueva versi&oacute;n de la API:<\/p>\n<p dir=\"ltr\"><a href=\"https:\/\/api.fib.upc.edu\/v2\/\"><u>https:\/\/api.fib.upc.edu\/<\/u><\/a><\/p>\n<p dir=\"ltr\">Hay que a&ntilde;adir que la versi&oacute;n anterior de la API del &quot;Rac&oacute;&quot; seguir&aacute; en funcionamiento y en mantenimiento, todo y que ahora los esfuerzos se concentrar&aacute;n en facilitar el acceso de recursos v&iacute;a la nueva versi&oacute;n.<\/p>\n<h2 dir=\"ltr\">Como hemos dise&ntilde;ado esta API?<\/h2>\n<p dir=\"ltr\">La versi&oacute;n anterior de la API se cre&oacute; a medida para las aplicaciones m&oacute;viles y por la integraci&oacute;n de servicios dentro de la FIB. Su arquitectura pues, era muy poco homog&eacute;nea. La API estaba formada por servicios creados ad-hoc, sin un formato com&uacute;n y que s&oacute;lo estaban bajo un mismo paraguas para facilitar su uso. Sin embargo, han cumplido su objetivo durante mucho tiempo.<\/p>\n<p dir=\"ltr\">Empezar una nueva versi&oacute;n desde cero nos dio la oportunidad para crear una estructura com&uacute;n a seguir. En este caso nos dejamos guiar por la filosof&iacute;a REST. La nueva versi&oacute;n de la API est&aacute; compuesta por un conjunto de recursos enlazados entre s&iacute;. Los enlaces permiten que sea auto explorable s&oacute;lo obteniendo la p&aacute;gina inicial.&nbsp;Esto facilita la posibilidad de hacer la API auto-documentada: las mismas URLs de los recursos tienen la documentaci&oacute;n para su propio uso. Por otra parte, otra caracter&iacute;stica de la API es que los recursos se pueden obtener en diferentes formatos. De forma gen&eacute;rica se puede obtener en json y la documentaci&oacute;n en formato de p&aacute;gina web. De forma m&aacute;s espec&iacute;fica, podemos encontrar como recursos internos se pueden obtener tambi&eacute;n en formato iCalendar, JPEG o PNG. (1)<\/p>\n<p dir=\"ltr\">Internamente se ha utilizado el framework Django REST Framework para desarrollarla. Sobre este framework hicimos art&iacute;culo en este mismo blog (<a href=\"http:\/\/inlab.fib.upc.edu\/es\/blog\/django-api-rest\">http:\/\/inlab.fib.upc.edu\/es\/blog\/django-api-rest<\/a>). El uso de este framework nos facilita much&iacute;simo que el dise&ntilde;o de la API sea coherente y tambi&eacute;n que sea autodocumentada.<\/p>\n<p dir=\"ltr\">Actualmente, la API es &uacute;nicamente de lectura. Se ofrecen los datos de diferentes sistemas de la FIB de una forma unificada: datos de gesti&oacute;n acad&eacute;mica, sistema de reservas de aulas, sistema de reservas de salas de presentaciones, ocupaci&oacute;n de los PC &#8230; Muchos de estos sistemas comparten una misma base de datos.Con el fin de ayudar en la estructuraci&oacute;n de los datos se ha hecho unas vistas SQL que exponen la informaci&oacute;n que nos interesa ofrecer y aplica transformaciones si es necesario. Por otra parte, algunos servicios han requerido otros m&eacute;todos para obtener los datos. Algunos son basados en llamadas http a otros servicios internos. En resumen pues, la nueva API hace de fachada de todos los sistemas de la FIB. Aislando as&iacute; las complejidades internas de c&oacute;mo est&aacute;n estructuradas los datos.<\/p>\n<p dir=\"ltr\">&nbsp;<\/p>\n<p dir=\"ltr\"><img fetchpriority=\"high\" decoding=\"async\" class=\" size-full wp-image-2284\" alt=\"\" src=\"https:\/\/inlab.fib.upc.edu\/wp-content\/uploads\/2017\/02\/esquema-api-fib.png\" width=\"602\" height=\"465\" srcset=\"https:\/\/inlab.fib.upc.edu\/wp-content\/uploads\/2017\/02\/esquema-api-fib.png 602w, https:\/\/inlab.fib.upc.edu\/wp-content\/uploads\/2017\/02\/esquema-api-fib-300x232.png 300w, https:\/\/inlab.fib.upc.edu\/wp-content\/uploads\/2017\/02\/esquema-api-fib-370x286.png 370w\" sizes=\"(max-width: 602px) 100vw, 602px\" \/><\/p>\n<p>&nbsp;<\/p>\n<h2 dir=\"ltr\">API p&uacute;blica vs API privada<\/h2>\n<p dir=\"ltr\">Mucha de la informaci&oacute;n que proporciona la API es totalmente p&uacute;blica. De hecho, en paralelo a la creaci&oacute;n de la API se ha estado trabajando para que la web de la FIB obtenga toda la informaci&oacute;n v&iacute;a API. As&iacute; pues la informaci&oacute;n abierta en la web de la FIB como listas de asignaturas, horarios, la gu&iacute;a docente, las universidades con las que hay programas de intercambio &#8230;ahora es tambi&eacute;n consultable v&iacute;a la nueva API. Para acceder a esta informaci&oacute;n, necesitar&aacute; un client_id que podr&aacute; pedir utilizando su login del &quot;Rac&oacute;&quot;.<\/p>\n<p dir=\"ltr\">Por otro lado, tenemos una parte privada de la API que muestra informaci&oacute;n personalizada de los estudiantes del &quot;Rac&oacute;&quot;. Para proteger esta parte, decidimos seguir el protocolo de autorizaci&oacute;n OAuth 2.0.<\/p>\n<p dir=\"ltr\">Hace ya unos 4 a&ntilde;os os ense&ntilde;amos <a href=\"http:\/\/inlab.fib.upc.edu\/es\/blog\/oauth-con-android-en-el-raco-de-la-fib\">c&oacute;mo utilizar OAuth 1.0 a la API del &quot;Rac&oacute;&quot;<\/a>. Pues bien, ahora os ense&ntilde;aremos c&oacute;mo utilizar la segunda versi&oacute;n de este protocolo.<\/p>\n<h2 dir=\"ltr\">OAuth2<\/h2>\n<p dir=\"ltr\">Tenemos una aplicaci&oacute;n de ejemplo en:<\/p>\n<p dir=\"ltr\"><a href=\"https:\/\/github.com\/FIBUPC\/demo_fib_api_flask\">https:\/\/github.com\/FIBUPC\/demo_fib_api_flask<\/a><\/p>\n<p dir=\"ltr\">Que podemos ver en funcionamiento en:<\/p>\n<p dir=\"ltr\"><a class=\"moz-txt-link-freetext\" href=\"http:\/\/demo-api-fib-oauth.herokuapp.com\">http:\/\/demo-api-fib-oauth.herokuapp.com<\/a><\/p>\n<p dir=\"ltr\">Puede probarlo en una app aparte de heroku usando el bot&oacute;n de &quot;Deploy to Heroku&quot; en el repositorio o siguiendo el siguiente enlace:<\/p>\n<p dir=\"ltr\"><a href=\"https:\/\/www.heroku.com\/deploy?template=https:\/\/github.com\/FIBUPC\/demo_fib_api_flask\/tree\/master\">https:\/\/www.heroku.com\/deploy?template=https:\/\/github.com\/FIBUPC\/demo_fib_api_flask\/tree\/master<\/a><\/p>\n<p dir=\"ltr\">OAuth 2.0 permite diferentes flujos de autenticaci&oacute;n. La API s&oacute;lo tiene implementado el Authorization code, para aplicaciones en el servidor que es el que utiliza esta aplicaci&oacute;n. El flujo es el siguiente:<\/p>\n<ul>\n<li dir=\"ltr\">\n<p dir=\"ltr\">Si nosotros como programadores estamos interesados en hacer una aplicaci&oacute;n que utilice la API privada, lo que tendremos que hacer primero es darla de alta en la API y obtener un client_key y un client_secret. Estos dos valores identifican nuestra aplicaci&oacute;n a la API. Es importante no compartirlos, especialmente el client_secret, ya que es como la contrase&ntilde;a de nuestra aplicaci&oacute;n.<\/p>\n<\/li>\n<li dir=\"ltr\">\n<p dir=\"ltr\">El bot&oacute;n de login de la aplicaci&oacute;n apunta a una pantalla de la API donde se nos pide la autorizaci&oacute;n para la aplicaci&oacute;n. Previamente a ver esta pantalla, el usuario habr&aacute; hecho login en la API y por tanto como usuario estamos autorizando a la aplicaci&oacute;n acceder a nuestros datos<\/p>\n<\/li>\n<li dir=\"ltr\">\n<p dir=\"ltr\">Una vez el usuario ha aceptado, la API redirigir&aacute; hacia la URL que hemos indicado al registrar la aplicaci&oacute;n, que recibir&aacute; un par&aacute;metro llamado &quot;authentication code&quot;.<\/p>\n<\/li>\n<li dir=\"ltr\">\n<p dir=\"ltr\">A partir de este &quot;authentication code&quot;, la aplicaci&oacute;n pide a la API un token. Este token queda vinculado al usuario que ha entrado a la aplicaci&oacute;n y permite acceder a la API en su nombre durante un per&iacute;odo limitado de unas 6 horas. (2)<\/p>\n<\/li>\n<\/ul>\n<p dir=\"ltr\">Gracias al que el usuario est&aacute; autenticando y est&aacute; dando confirmaci&oacute;n directamente a la API, la aplicaci&oacute;n no tendr&aacute; nunca las credenciales y por tanto no pueden quedar comprometidas.<\/p>\n<p dir=\"ltr\">Todo esto que parece tan complicado queda escondido por las librer&iacute;as de OAuth. En la aplicaci&oacute;n de ejemplo, simplemente debemos pasar las credenciales de la aplicaci&oacute;n, la URL donde el usuario debe hacer login y la URL de autorizaci&oacute;n. La librer&iacute;a se encarga del resto, a&ntilde;adiendo a las peticiones a la API las cabeceras pertinentes con los toquens.<\/p>\n<p dir=\"ltr\">Una aplicaci&oacute;n de m&oacute;vil tambi&eacute;n puede utilizar este flujo, aunque el client_secret est&aacute; en manos del cliente y no en un servidor al que el usuario no tiene acceso. Es importante que a pesar de ser una aplicaci&oacute;n nativa, la autorizaci&oacute;n de la aplicaci&oacute;n se haga en un navegador y no una webview interna para asegurar que la aplicaci&oacute;n no tiene ning&uacute;n acceso a las credenciales. Pero de todo esto &#8230; tal vez habr&iacute;a que hacer otro art&iacute;culo entero. (3)<\/p>\n<h2 dir=\"ltr\">Para qu&eacute; puede servir la API?<\/h2>\n<p dir=\"ltr\">El hecho de disponer de una API p&uacute;blica permite que no s&oacute;lo el inLab pueda crear nuevas aplicaciones &uacute;tiles para la comunidad de la FIB. El acceso controlado a los datos permite que cualquier estudiante o profesor pueda convertirse en desarrollador. Y talento y ganas en esta facultad precisamente no faltan.<\/p>\n<p dir=\"ltr\">Por ejemplo, gracias a la API se podr&iacute;a hacer &#8230;<\/p>\n<ul>\n<li dir=\"ltr\">\n<p dir=\"ltr\">Un explorador de horarios din&aacute;mico durante la matr&iacute;cula que tenga en cuenta qu&eacute; grupos est&aacute;n llenos o a punto de llenarse.<\/p>\n<\/li>\n<li dir=\"ltr\">\n<p dir=\"ltr\">Un cl&aacute;sico que todo fiber ha pensado alguna vez: un programa para generar horarios sin &quot;solapamientos&quot;. Y con un extra: hacer que los ex&aacute;menes finales queden lo m&aacute;s espaciados posibles.<\/p>\n<\/li>\n<li dir=\"ltr\">\n<p dir=\"ltr\">Una app que nos diga a qu&eacute; aula tenemos que ir si queremos tener un PC durante 3 horas sin interrupciones. Y que nos avise de cuando tenemos clase!<\/p>\n<\/li>\n<li dir=\"ltr\">\n<p dir=\"ltr\">Soy un profesor y necesito 4 aulas de laboratorio durante 2 horas para hacer un examen. Tengo alg&uacute;n espacio disponible?<\/p>\n<\/li>\n<li dir=\"ltr\">\n<p dir=\"ltr\">Pintar un grafo de los requisitos para ver qu&eacute; asignaturas se deben hacer para hacer una concreta.<\/p>\n<\/li>\n<li dir=\"ltr\">\n<p dir=\"ltr\">Un planificador de viajes en funci&oacute;n de los d&iacute;as festivos del cuatrimestre correspondiente.<\/p>\n<\/li>\n<\/ul>\n<p dir=\"ltr\">Estos no son m&aacute;s que ejemplos que me pasan por la cabeza ahora mismo. Seguro que vosotros tendr&eacute;is de mejores. Esta es la raz&oacute;n por la que hemos hecho la nueva API!<\/p>\n<h2 dir=\"ltr\">Futuro de la API<\/h2>\n<p dir=\"ltr\">Uno de los primeros objetivos a la hora de dise&ntilde;ar la nueva API era que se pudiera continuar su desarrollo una vez lanzada. La idea es continuar haciendo crecer la API con el tiempo poniendo a disposici&oacute;n p&uacute;blica nuevos datos. En este sentido, estamos abiertos a sugerencias! &iquest;Le gustar&iacute;a ver alg&uacute;na informaci&oacute;n en espec&iacute;fico a la API? Escr&iacute;banos un ticket y lo estudiaremos.<\/p>\n<p dir=\"ltr\">Creemos que la nueva API puede ser una oportunidad excelente para crear comunidad en la FIB. Es por ello que tambi&eacute;n os animamos a decirnos que pens&aacute;is, como la estais utilizando, compartir vuestras aplicaciones.<\/p>\n<h2 dir=\"ltr\">Referencias<\/h2>\n<ol>\n<li dir=\"ltr\">\n<p dir=\"ltr\"><a href=\"https:\/\/api.fib.upc.edu\/v2\/docs\/main\" target=\"_blank\" rel=\"noopener\"><u>https:\/\/api.fib.upc.edu\/v2\/docs\/main<\/u><\/a> &#8211; Documentaci&oacute;n con formatos de la API<\/p>\n<\/li>\n<li dir=\"ltr\">\n<p dir=\"ltr\"><a href=\"http:\/\/stackoverflow.com\/questions\/17427707\/whats-the-right-oauth-2-0-flow-for-a-mobile-app\/38582630#38582630\" target=\"_blank\" rel=\"noopener\"><u>http:\/\/stackoverflow.com\/questions\/17427707\/whats-the-right-oauth-2-0-flow-for-a-mobile-app\/38582630#38582630<\/u><\/a> &#8211; En apps web &#8230; no hacer una webview. El login debe ser en un navegador independiente para asegurar que la aplicaci&oacute;n no puede acceder a los passwords!<\/p>\n<\/li>\n<li dir=\"ltr\">\n<p dir=\"ltr\"><a href=\"https:\/\/api.fib.upc.edu\/v2\/docs\/oauth\" target=\"_blank\" rel=\"noopener\"><u>https:\/\/api.fib.upc.edu\/v2\/docs\/oauth<\/u><\/a> -Documentaci&oacute;n detallada OAuth de la API<\/p>\n<\/li>\n<\/ol>\n<h2 dir=\"ltr\">Bibliograf&iacute;a recomendada OAuth<\/h2>\n<ul>\n<li dir=\"ltr\">\n<p dir=\"ltr\"><a href=\"http:\/\/stackoverflow.com\/a\/32534239\/7020590\" target=\"_blank\" rel=\"noopener\"><u>http:\/\/stackoverflow.com\/a\/32534239\/7020590<\/u><\/a> &#8211; OAuth 2.0 Donuts, probablemente una de las mejores explicaciones del funcionamiento de OAuth para aquellos que apenas est&aacute;n empezando a trabajar con APIs y protocolos de autorizaci&oacute;n.<\/p>\n<\/li>\n<li dir=\"ltr\">\n<p dir=\"ltr\"><a href=\"https:\/\/www.digitalocean.com\/community\/tutorials\/an-introduction-to-oauth-2\" target=\"_blank\" rel=\"noopener\"><u>https:\/\/www.digitalocean.com\/community\/tutorials\/an-introduction-to-oauth-2<\/u><\/a> &#8211;&nbsp;Un buen tutorial de c&oacute;mo funciona OAuth 2.0. El tutorial de nuestra API est&aacute; basado en este.<\/p>\n<\/li>\n<li dir=\"ltr\">\n<p dir=\"ltr\"><a href=\"https:\/\/tools.ietf.org\/html\/rfc6749\" target=\"_blank\" rel=\"noopener\"><u>https:\/\/tools.ietf.org\/html\/rfc6749<\/u><\/a> &#8211; Publicaci&oacute;n oficial del protocolo OAuth 2.0.<\/p>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Este 2016 desde el inLab hemos desarrollado una nueva API para la FIB. El objetivo del proyecto era dar, de forma estructurada, la informaci&oacute;n publica de la FIB. Como da m&aacute;s informaci&oacute;n que la anterior versi&oacute;n, hemos decidido que era hora de desvincularla del &quot;Rac&oacute;&quot; y darle la importancia que se merece. Os presentamos pues [&hellip;]<\/p>\n","protected":false},"author":594,"featured_media":2281,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[1],"tags":[],"experteses":[17],"class_list":["post-2344","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-uncategorized-ca","experteses-entornosyserviciosticdesoportealaprendizaje-es"],"acf":[],"_links":{"self":[{"href":"https:\/\/inlab.fib.upc.edu\/es\/wp-json\/wp\/v2\/posts\/2344","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/inlab.fib.upc.edu\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/inlab.fib.upc.edu\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/inlab.fib.upc.edu\/es\/wp-json\/wp\/v2\/users\/594"}],"replies":[{"embeddable":true,"href":"https:\/\/inlab.fib.upc.edu\/es\/wp-json\/wp\/v2\/comments?post=2344"}],"version-history":[{"count":0,"href":"https:\/\/inlab.fib.upc.edu\/es\/wp-json\/wp\/v2\/posts\/2344\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/inlab.fib.upc.edu\/es\/wp-json\/wp\/v2\/media\/2281"}],"wp:attachment":[{"href":"https:\/\/inlab.fib.upc.edu\/es\/wp-json\/wp\/v2\/media?parent=2344"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/inlab.fib.upc.edu\/es\/wp-json\/wp\/v2\/categories?post=2344"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/inlab.fib.upc.edu\/es\/wp-json\/wp\/v2\/tags?post=2344"},{"taxonomy":"experteses","embeddable":true,"href":"https:\/\/inlab.fib.upc.edu\/es\/wp-json\/wp\/v2\/experteses?post=2344"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}