Implementando Resource Owner Password Grant
Clase 24 de 39 • Curso de Autenticación con OAuth
Aplicaciones altamente confiables pueden usar este flujo, ya que en este flujo se le pregunta al usuario final llenar sus credenciales (usuario/contraseña) con un formulario interactivo y luego la información es enviada al authorization server.
Usa este flujo solo si lo siguiente aplica:
- Se le puede confiar absolutamente a la aplicación las credenciales del usuario. Para aplicaciones del lado del cliente o aplicaciones mobile se recomienda usar otros flujos.
- Un flujo basado en redireccionamiento no es posible debido a que es una apliación legada. Si el redireccionamiento es posible se recomienda usar mejor Authorization Code Grant.
Conociendo el flujo
La definición de Resource Owner Password Grant puede ser encontrada en https://tools.ietf.org/html/rfc6749#section-4.3.
- El usuario final ingresa sus credenciales en la aplicación (cliente) mediante un formulario.
- La aplicación envía las credenciales al Authorization Server.
- El Authorization Server valida las credenciales y devuelve un Access Token.
- La aplicacion ahora puede usar el Access Token para llamar la API en nombre del usuario.
Detalles de implementación
Para su implementación se debe implementar de parte de la aplicación un formulario que tome las credenciales del usuario y luego pueda hacer una petición al Authorization Server. Es sumamente importante que esto suceda en una conexión segura HTTPS.
- La aplicación obtiene las credenciales desde el formulario.
- La aplicación hace una petición al Authorization Server.
const request = require("request"); const options = { method: "POST", url: "https://<authorization-server>/oauth/token", headers: { "content-type": "application/json" }, body: { grant_type: "password", username: "<username>", password: "<password>", audience: "<your-audience>", scope: "<your-scopes>", client_id: "<your-client-id>", client_secret: "<your-client-secret>" }, json: true }; request(options, function(error, response, body) { if (error) { throw new Error(error); } console.log(body); });
- La respuesta tiene un JSON Web Token, generalmente de tipo
Bearer
incluyendo el tiempo de expiración.
{ "access_token": "eyJz93a...k4laUWw", "token_type": "Bearer", "expires_in": 36000 }
- La aplicación ya puede usar el JSON Web Token para hacer peticiones a los recursos del usuario (API) en nombre de él.
const request = require("request"); const options = { method: "GET", url: "https://someapi.com/api", headers: { authorization: "Bearer <access-token>", "content-type": "application/json" } }; request(options, function(error, response, body) { if (error) throw new Error(error); console.log(body); });
Con esto tenemos los conocimientos necesarios para poder implementar este flujo. Recuerda seguir las recomendaciones para darle un uso adecuado.