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
Unidad 2 - Arquitectura REST
- 575