Service Oriented Architecture
Fuente: wikipedia.org
Service Oriented Architecture
Representational State Transfer
Transferencia de los estados de los recursos mediante formatos como XML, Atom, RSS o JSON
Ejercicio (5%)
Consumir tres recursos del RestAPI de WikiMedia mediante jQuery
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
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.
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 |
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