Arquitectura REST

SOA

Service Oriented Architecture

Fuente: wikipedia.org

REST

Representational State Transfer

SOAP

Simple Object Acess Protocol

  • Operaciones definidas por HTTP (GET, PUT, DELETE y POST)
  • JSON o XML
  • Mayor rendimiento
  • Retos en seguridad
  • Operaciones definidas por el programador
  • XML
  • Menor rendimiento
  • Mayores niveles de seguridad

SOA

Service Oriented Architecture

REST

Representational State Transfer

¿Qué significa?

  • Transferencia: Transferencia de datos de recursos de una aplicación a otra
  • Estado: Se preocupa por los estados/cambios de los recursos más que por las acciones
  • Representacional: Se pueden usar variados formatos de representación como XML, Atom, RSS o JSON

 

Transferencia de los estados de los recursos mediante formatos como XML, Atom, RSS o JSON

Métodos 

  • POST (Crear)
  • GET (Leer o Obtener)
  • UPDATE o PATCH (Actualizar)
  • DELETE (Borrar) 

Respuestas

Ejercicio (5%)

Consumir tres recursos del RestAPI de WikiMedia mediante jQuery

Arquitectura Rest
=
ROA (Resource Oriented Architecture)

¿Recurso?

Es todo lo suficientemente importante como para hacer una referencia específica de él

  • Dos recursos no pueden tener un misma URI

  • Todo recurso debe ser direccionable

URI (Uniform Resource Identifier)

  • http://www.example.com/software/releases/1.0.3.tar.gz
  • http://www.example.com/weblog/2006/10/24/0
  • http://www.example.com/wiki/Jellyfish
  • http://www.example.com/search/Jellyfish
  • http://www.example.com/nextprime/1024
  • http://www.example.com/relationships/Alice;Bob
  • http://www.example.com/bugs/by-state/open.es
  • http://www.example.com/sales/2004/Q4

La sintaxis en que debe representarse el recurso debe darse en la url

Toda solicitud HTTP ocurre de manera aislada. El servidor no debe usar información de una solicitud anterior.

Statelessness (Sin estado)

Los posibles estados de un recurso, son también recursos.

 

Los estados de la sesión son guardados en el cliente.

PUT POST GET DELETE
/weblogs Sin efecto Crea un nuevo weblog Obtiene listado de weblogs Sin efecto
/weblogs/myweblog Modifica o crea este weblog Crea una nueva entrada en el weblog Obtiene el weblog Elimina el weblog
/weblogs/myweblog/entries/1 Modifica la entrada del weblog Envía una comentario a la entrada del weblog Obtiene la entrada del weblog Elimina el weblog

Intefaz Uniforme

Autenticación

Basic Authentication

GET /resource.html HTTP/1.1
Host:www.example.com
Authorization: Basic QWxpYmFiYTpvcGVuIHNlc2FtZQ==
401 Unathorized
WWW-Authenticate: Basic realm= "My Private Data"

Consulta HTTP

Respuesta HTTP No Autorizado

La contraseña se codifica en base64

Digest Authentication

GET /dir/index.html HTTP/1.0
Host: localhost
Authorization: Digest username="Mufasa",
                     realm="testrealm@host.com",
                     nonce="dcd98b7102dd2f0e8b11d0f600bfb0c093",
                     uri="/dir/index.html",
                     qop=auth,
                     nc=00000001,
                     cnonce="0a4f113b",
                     response="6629fae49393a05397450978507c4ef1",
                     opaque="5ccc069c403ebaf9f0171e9517f40e41"

//HA1=MD5(username:realm:password)
//HA2=MD5(method:digestURI)
//response=MD5(HA1:nonce:HA2)
HTTP/1.0 401 Unauthorized
Server: HTTPd/0.9
Date: Sun, 10 Apr 2014 20:26:47 GMT
WWW-Authenticate: Digest realm="testrealm@host.com",
                        qop="auth,auth-int",
                        nonce="dcd98b7102dd2f0e8b11d0f600bfb0c093",
                        opaque="5ccc069c403ebaf9f0171e9517f40e41"
Content-Type: text/html
Content-Length: 153

Consulta HTTP

Respuesta HTTP No Autorizado

Autenticación más segura pues no viaja la contraseña y la respuesta es cifrada mediante MD5

OAuth

     +--------+                               +---------------+
     |        |--(A)- Authorization Request ->|   Resource    |
     |        |                               |     Owner     |
     |        |<-(B)-- Authorization Grant ---|               |
     |        |                               +---------------+
     |        |
     |        |                               +---------------+
     |        |--(C)-- Authorization Grant -->| Authorization |
     | Client |                               |     Server    |
     |        |<-(D)----- Access Token -------|               |
     |        |                               +---------------+
     |        |
     |        |                               +---------------+
     |        |--(E)----- Access Token ------>|    Resource   |
     |        |                               |     Server    |
     |        |<-(F)--- Protected Resource ---|               |
     +--------+                               +---------------+

Estándar para autorización delegada, sin embargo puede usarse para autenticación

OAuth (Código)

https://authorization-server.com/auth?response_type=code&
  client_id=CLIENT_ID&redirect_uri=REDIRECT_URI&scope=photos&state=1234zyx

//code - Indica al servidor que se esta esperando un código de autorización
//client_id - El identificador del cliente es dado al crear la aplicación
//redirect_uri - Indica la URL donde se dirige una vez se dé la autorización
//scope - Indica uno o más valores indicando a que recursos se requiere acceder
//state - Un número aleatorio generado por la aplicación para verificarse luego
https://example-app.com/cb?code=AUTH_CODE_HERE&state=1234zyx

//code - El servidor retorna el código en la url de redirección 
//state - El servidor regresa el número aleatorio de verificación
POST https://api.authorization-server.com/token?grant_type=authorization_code&code=AUTH_CODE_HERE&redirect_uri=REDIRECT_URI&  client_id=CLIENT_ID&  client_secret=CLIENT_SECRET

//grant_type=authorization_code - Le indica al servidor que se enviará un código de autorización
//client_secret=CLIENT_SECRET - Algunas aplicaciones usan un password, este elemento es opcional
{
  "access_token":"RsT5OjbzRn430zqMLgV3Ia",
  "expires_in":3600
}
https://example-server.com/resource?access_token=ACCESS_TOKEN

Ejemplo Google

https://accounts.google.com/o/oauth2/v2/auth?response_type=code&client_id=824056544401-88b9t811ooqnqss9eedc8lf8e3a0bh1n.apps.googleusercontent.com&redirect_uri=http://www.example.com/redirect&scope=https://www.googleapis.com/auth/userinfo.profile https://www.googleapis.com/auth/user.emails.read
&state=1234zyx
http://www.example.com/redirect?state=1234zyx&code=4/AABsDXA7zsrjwyiZV47Ju7DQa8xlrpzD8XlEPMp4Wr0BDM_dcpwqV_iE_FxecCW8WzxGZwC8gWTylN9Vrorbd0Q#
POST https://accounts.google.com/o/oauth2/token

Content-Type: application/x-www-form-urlencoded
grant_type=authorization_code&code=4/AABLVmhBmepAYhAM5n5jLNXls1hhWCwm-vi5xmCYPJRM2HtDOTf1tx4M8yTNEGAC-HS2KpxVhJznuO0-glTXsuU#&client_id=824056544401-88b9t811ooqnqss9eedc8lf8e3a0bh1n.apps.googleusercontent.com&redirect_uri=http://www.example.com/redirect&client_secret=hC-sZyNwIVMilV28ES4E93LU
{
"access_token": "ya29.Glt6BaDtkJ0M8QuPFaEUg9aFv2zV7iLfjruYzO2lIPH6BV0yHpe766e0UNOzVufa3SxB9noXWs8A7rVVnqJ1JpDm3XRX8SJBJsZjZBFqPd2gkU5FcBffrGoyLnxA",
"expires_in": 3504,
"id_token": "eyJhbGciOiJSUzI1NiIsImtpZCI6ImFjMmI2M2ZhZWZjZjgzNjJmNGM1MjhlN2M3ODQzMzg3OTM4NzAxNmIifQ.eyJhenAiOiI4MjQwNTY1NDQ0MDEtODhiOXQ4MTFvb3FucXNzOWVlZGM4bGY4ZTNhMGJoMW4uYXBwcy5nb29nbGV1c2VyY29udGVudC5jb20iLCJhdWQiOiI4MjQwNTY1NDQ0MDEtODhiOXQ4MTFvb3FucXNzOWVlZGM4bGY4ZTNhMGJoMW4uYXBwcy5nb29nbGV1c2VyY29udGVudC5jb20iLCJzdWIiOiIxMDk2NDY2OTczODQ3MjMwMjYyNDEiLCJhdF9oYXNoIjoiaXY4UTdjckdqSWFnc2RaclVUcmN0QSIsImV4cCI6MTUyMDczMjYxMSwiaXNzIjoiYWNjb3VudHMuZ29vZ2xlLmNvbSIsImlhdCI6MTUyMDcyOTAxMX0.GrefoG-qgwlcfQ60GI5cKsTnkpJcdFuzC7MKYzdYgNaXPoBk2av8NLw9vWzaXildI-2tGgxFskedLMkWhOHeU6AgN3HlaX2GSD-xt_MXjKi_PR_EQE8eh-Jxf0zVGyVM_W1vRv0O_YjMIGUEyJCMyBcuERpnKCudRtfzFJdsRTYegVSHSyLC2prbSuIPLkKl-l2uFMM4GGoIBfLSyf7_aYi4JzfRN42NUkC0G0bh6BedE3wnVep9qtitRe8aohDmbvzY5oWltxn1g1zMPG1GZI9Z8Y5LWNWsb1l6RkhGmL02W25zMUGBj-8go3mQkRhMgQK-fLmFK7H6K-ylzwqfmQ",
"token_type": "Bearer"
}
https://people.googleapis.com/v1/people/me?personFields=names,emailAddresses,photos&key=AIzaSyDL3on1UvmgP_VNC3nwEgp7-ahOuL9B8V0

Authorization: Bearer ya29.Glt6BaDtkJ0M8QuPFaEUg9aFv2zV7iLfjruYzO2lIPH6BV0yHpe766e0UNOzVufa3SxB9noXWs8A7rVVnqJ1JpDm3XRX8SJBJsZjZBFqPd2gkU5FcBffrGoyLnxA

Unidad 2 - Arquitectura REST

By Gustavo Andrés Uribe Gómez