Anda di halaman 1dari 36

Mster

Universitario en Ingeniera Informtica

REST avanzado
Sistemas de Informacin Orientados a Servicios

R O D R I G O S A N T A M A R A

OAuth
Flask

REST avanzado

Objetivo
3

En Sistemas Distribuidos vimos cmo:


invocar un servicio REST desde un navegador/consola/Java
implementar un servicio REST en Java mediante Jersey
Ahora veremos cmo
Autenticar aplicaciones para usar APIs con seguridad OAuth
Implementar un servicio REST desde Python con Flask

OAuth
4
D E F I N I C I N: R O L E S Y M O D O S
OAUTH 2.0
CLAVE Y PALABRA SE CRE TA
COMPOSICIN Y CODIFICACIN
TOKE N DE ACCE SO
USO

APIs con autenticacin: OAuth


5

OAuth es un protocolo abierto para autorizacin


Permite que un proveedor de un recurso garantice el
acceso a un cliente, previa autorizacin de su propietario
P.

ej. permite que Facebook (proveedor) garantice el acceso a


nuestros datos (propietario) a otra aplicacin (cliente)

Sin que el propietario deba compartir su clave con el cliente


Diseado sobre HTTP (intercambio de mensajes via REST)
En esencia implica la emisin de un permiso (access token)
para acceder a los datos propietarios del proveedor

OAuth: roles
6

Rol

Sinnimo

Descripcin

Cliente

Aplicacin

Aplicacin que est intentando acceder a


los recursos del usuario

Proveedor
(del recurso)

API

El servidor que provee la API por la que


se accede a los recursos del usuario

Propietario
(del recurso)

Usuario

Propietario del recurso que debe dar


acceso a una porcin de su cuenta

OAuth: modalidades*
7

Autenticacin slo de aplicacin


Permite hacer peticiones al proveedor en nombre del
cliente, pero sin hacerlo en nombre de ningn usuario
OAuth de 3 patas
El modo normal, permite al cliente hacer peticiones al
proveedor en nombre de un usuario (previo consentimiento)
OAuth basado en PIN: modalidad para clientes sin acceso a un
navegador web (rdenes de consola, sistemas empotrados, etc.)

OAuth Echo
OAuth de 4 patas, aade el rol del delegador, un
proveedor secundario que acta a travs del proveedor
primario
* Twitter cuenta con una buena explicacin de estas y otras modalidades

OAuth 2.0
8

OAuth2 mejora la escala de aplicacin del

protocolo
Sin embargo, el diseo del protocolo puede inducir
a problemas importantes de seguridad a resolver
durante su implementacin

Artculo crtico de Eran Hammer con la versin 2.0

http://hueniverse.com/2012/07/26/oauth-2-0-and-the-road-to-hell/

OAuth 2.0: Funcionamiento


9

OAuth2: A Tale of Two servers

https://www.youtube.com/watch?v=tFYrq3d54Dc

registro como cliente


1

3-legged

cliente
(p. ej. mi app)

credenciales
peticin que requiere confirmacin de usuario

cdigo
cdigo + credenciales

proveedor
(p. ej. Facebook)

garantizas
acceso?

token de acceso
3

peticin + token
usuario

Ejemplo: Twitter y OAuth de aplicacin (1)


10

(1) Handshake o registra tu app


1.
Conectarse con una cuenta de Twitter
2. Crear una nueva aplicacin (http://apps.twitter.com)
Se

le asignar una clave y palabra secreta (credenciales)


No deben compartirse (especialmente la palabra secreta)
Clave y palabra secreta deben concatenarse con : y codificarse
en Base64* para compartirse mediante servicios web
Ejemplo
Clave: xvz1evFS4wEEPTGEFPHBog
Palabra secreta: L8qq9PZyRg6ieKGEKhZolGC0vJWLw8iEJ88DRdyOg
Codificacin (p. ej. usando comando OpenSSL):
$ openssl enc -base64 <<<
xvz1evFS4wEEPTGEFPHBog:L8qq9PZyRg6ieKGEKhZolGC0vJWLw8iEJ88DRdyOg
eHZ6MWV2RlM0d0VFUFRHRUZQSEJvZzpMOHFxOVBaeVJnNmllS0dFS2hab2xHQzB2
SldMdzhpRUo4OERSZHlPZwo=

*Por qu Base64?

Ejemplo: Twitter (2)


11

(2) Peticin de token de acceso: POST a oauth2/token

Ejemplo 1 (curl)

curl --request 'POST' 'https://api.twitter.com/oauth2/token' -header 'Authorization: CREDENCIALES, Content-Type: application/xwww-form-urlencoded;charset=UTF-8' --data
"grant_type=client_credentials" verbose k

CREDENCIALES es la clave:palabra codificada en Base64


-k hace la conexin SSL sin certificado

Ejemplo 2 (curl, no hace falta codificacin Base 64 previa)

curl -X POST --verbose "https://api.twitter.com/oauth2/token"


-d "grant_type=client_credentials" -u clave:palabraSecreta k

Obtendremos una respuesta JSON con el token de acceso

{"token_type":"bearer","access_token":"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA%2FAAAAAAAAAA
AAAAAAAAAA%3DAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"}

Ejemplo: Twitter (3)


12

(3) Peticiones posteriores: aadir una cabecera

Authorization con el token a todas las invocaciones


de servicios que soporten OAuth a nivel de aplicacin

Ejemplo (curl):
curl --request 'GET'
'https://api.twitter.com/1.1/statuses/user_timeline.json?count=100
&screen_name=twitterapi' --header 'Authorization: Bearer
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA%2FAAAAAAAAAAAAAAAAAAAA%3DAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' k

Si el token se ve comprometido, podemos invalidarlo con una


llamada POST a oauth2/invalidate_token
Para ms detalles y FAQ, ver:

https://dev.twitter.com/docs/auth/application-only-auth

Para OAuth the 3 patas, ver:

https://dev.twitter.com/oauth/3-legged

OAuth y el mundo
13

Prcticamente toda API bien establecida mantiene

una poltica similar a la de Twitter

Facebook, Google, Instagram, Amazon, Reddit, Dropbox

http://en.wikipedia.org/wiki/OAuth#List_of_OAuth_service_providers

Si bien OAuth no es ni mucho menos perfecto, se ha convertido

en un estndar de facto

Flask
14
INTRODUCCIN
GE T, POST, PUT, DE LE TE
CORS
SUBIDA DE ARCH IVOS

Flask
15

Entorno de desarrollo web muy simple para Python*


Permite implementar servicios REST
Similar a Jersey (Java)
Anotaciones en los mtodos que implementan servicios
Ventaja: no necesita un soporte mediante Tomcat

Instalacin (ya instalado en el aula SUN):

$pip install flask

Aprenderemos a:
Implementar operaciones CRUD (GET, POST, PUT, DELETE)

Establecer cabeceras de seguridad CORS

http://blog.miguelgrinberg.com/post/designing-a-restful-api-with-python-and-flask
http://mortoray.com/2014/04/09/allowing-unlimited-access-with-cors/

Subir archivos a un servidor

http://flask.pocoo.org/docs/patterns/fileuploads/

* Tutorial muy sencillo de python: https://www.codecademy.com/learn/python


Una chuleta con operaciones frecuentes en Python:
http://vis.usal.es/rodrigo/documentos/soa/additional/pythonCheatsheet.pdf

Flask: primera aplicacin (app.py)


16

#!flask/bin/python
from flask import Flask
app = Flask(__name__)

1) Instanciamos una
aplicacin de Flask

@app.route('/')
def index():
return "Hello, World!"

2) Definimos un servicio

if __name__ == '__main__':
app.run(debug = True)

3) Ejecutamos la aplicacin

nos va a permitir realizar cambios en el cdigo sin relanzar la


aplicacin, adems de mostrar ms mensajes informativos

Flask: primera aplicacin (app.py)


17

1) Permisos de ejecucin
$ chmod a+x app.py
2) Lanzamos la aplicacin
$ ./app.py
* Running on http://127.0.0.1:5000/
* Restarting with reloader
cualquier mensaje adicional (peticiones
aceptadas, errores, etc.) aparecer aqu

Testeo:
Navegador web: http://localhost:5000
Consola:
curl i http://localhost:5000
incluye la cabecera HTTP en la
salida, a modo informativo

Flask: aumentando las opciones


18
1) Soporte para JSON

2) URI del servicio

3) Tipo de peticin
Podemos usar variables globales (la
implementacin de REST en Flask es
con estado)

Flask: mltiples URIs y errores


19
1) Soporte para errores
2) URI variable

3) Se recomienda usar el mismo nombre


en la URI que como argumento
abort retorna el error mediante HTTP, para dar un
error ms informativo, usamos errorhandler y
make_response

Flask: argumentos y request


20
1) Soporte para peticiones

2) Ni el URI ni la funcin tienen


argumentos

3) request.args es un
diccionario con todos los
parmetros pasados a la
URL

Flask: POST
21
1) Soporte para peticiones
2) tipo de mtodo: POST

3) Comprobamos que la peticin est codificada


en JSON y tiene un campo title

tomamos title (requerido) y description permitimos


que quede en blanco si no est en el request
retornamos la tarea en JSON y el
cdigo HTTP que indica creado

testeo con curl

Flask: POST
22

Opciones de curl:
-H para aadir cabecera HTTP de la peticin (p. ej. el
contenido es de tipo aplicacin en formato JSON)

http://en.wikipedia.org/wiki/List_of_HTTP_header_fields

-X para indicar el tipo de peticin (GET, POST, PUT, DELETE)


-d para aadir datos a la peticin en el formato indicado en la
cabecera

Flask: PUT
23

testeo con curl

Control exhaustivo de errores

Obtenemos la tarea actual

Para modificar una


tarea en la posicin
task_id

Flask: DELETE
24

Obtenemos la tarea actual

CORS
25

Poltica de Seguridad Same Origin


Un navegador web permite que los scripts de una web A accedan a
datos de una web B slo si A y B tienen el mismo origen

Entendiendo origen como host+puerto+URI

Evita que un software malicioso de una web acceda a datos sensibles


de otra web
No obstante, es una poltica poco flexible y limitante en algunos casos

Cross Origin Resource Sharing


Estndar para usar recursos en un origen distinto al que lo cre (cross
origin)
Definicin de nuevas cabeceras HTTP
En cabeceras de peticin: Origin
En cabeceras de respuesta: Access-Control-Allow-Origin

CORS: Ejemplo
26

Sea una pgina http://www.socialBooks.com que intenta

acceder a los datos en http://www.socialNetwork.com

Si el navegador del usuario implementa CORS (lo normal), aadir a


la peticin de socialBooks.com un campo:

Origin: http://www.socialBooks.com

Si socialNetwork.com acepta la peticin retornar la respuesta con


el siguiente campo en la cabecera:

Access-Control-Allow-Origin: http://www.socialBooks.com

Tambin podra garantizar acceso a cualquier origen (no recomendado)

Access-Control-Allow-Origin: *

Evita que, a nivel de navegador, una pgina se haga pasar

por otra para acceder a servicios ~ OAuth a otro nivel

CORS y Flask
27

Aadimos un mtodo que se ejecuta con cada una de

las peticiones para aadir campos a la cabecera

Subida de archivos
28

En ciertos servicios, tratamos con gran cantidad de

datos o archivos pesados propiedad del frontend

El frontend puede no ser tan potente como para procesarlos


Los datos se intercambian continuamente con el backend

Solucin para evitar trfico: subir archivos al backend

Subida de archivos en Flask


29

UPLOAD_FOLDER: ruta en el backend donde se almacenan

los archivos subidos


ALLOWED_EXTENSIONS: formatos permitidos

Importante limitar los formatos, para evitar problemas de inyeccin


(XML, SQL) o scripts maliciosos (PHP, archivos de cdigo en general)

Subida de archivos en Flask


30
retorna un valor vlido si el fichero
tiene una extensin permitida

convierte el nombre del archivo a


un nombre seguro para evitar
ataques basados en rutas

retorna la ruta en la que se guarda


el fichero (POST) o un formulario
para que se escoja un fichero a
subir mediante POST

Nombres de archivo y seguridad


31

Un ataque malicioso es enviar rutas relativas que

acceden a niveles superiores del rbol de directorios

filename = "../../../../home/username/.bashrc
Si acierta con el nmero de ../ puede estar sobreescribiendo
nuestro profile!

La funcin secure_filename simplemente

formatea este tipo de rutas:

Servir archivos y limitar tamao


32

Servicio para recuperar archivos subidos

Por defecto, se admiten archivos de cualquier tamao, pero


si queremos limitar slo tenemos que usar una variable

Barras de progreso
33

No entraremos en detalle, pero hay muchas opciones

en distintos lenguajes

Plupload (HTML5, Java, Flash)


SWFUpload (Flash)
JumpLoader (Java)

Resumen
34

OAuth es un mtodo de

autorizacin para que un


servicio pueda tener
identificado al consumidor
que accede a sus servicios

Consiste en un intercambio

previo de mensajes que nos


garantiza un access token
que incluiremos en nuestras
invocaciones de servicios

Toda API actual ha migrado o

est migrando hacia este tipo


de autorizacin

Flask es un entorno similar a

Java-RX para desarrollar


servicios REST en python
Funciona a travs de
anotaciones o decoraciones
(@app.xxx)
Permite realizar cualquier
operacin CRUD para
servicios RESTful (GET,
POST, DELETE, UPDATE)
Permite tambin una
autenticacin CORS a nivel
de aplicacin, y subida de
archivos al servidor.

Referencias
35

Aaron Parecki. OAuth 2 simplified. 2012.

Twitter. OAuth documentation

https://aaronparecki.com/2012/07/29/2/oauth2-simplified
https://dev.twitter.com/oauth

Eran Hammer. OAuth 2.0 and the road to hell. 2012

http://hueniverse.com/2012/07/26/oauth-2-0-and-the-road-to-hell/

OAuth2: A tale of two servers (vdeo, 2012)


https://www.youtube.com/watch?v=tFYrq3d54Dc

Flask. Pgina oficial

http://flask.pocoo.org/

Otros

recursos listados en la diapositiva 15

36