Protección de Endpoints con Autenticación y Autorización Básica
Clase 5 de 25 • Curso de OAuth 2.0 y OpenID Connect: Flujos de Autenticación y Casos de Estudio
Resumen
¿Cómo funciona la protección tradicional de un endpoint?
La protección de endpoints en la comunicación cliente-servidor es esencial para garantizar la seguridad y autorización de los usuarios que intentan acceder a recursos privados. En el proceso tradicional, un cliente hace una solicitud HTTP a un servidor. Si el cliente intenta llamar a un endpoint público, el servidor simplemente responde satisfactoriamente con un "200 OK". Sin embargo, cuando el cliente desea acceder a un endpoint privado, debe proporcionar autenticación. Si no lo hace, el servidor devuelve un error "401 No autorizado".
¿Cómo se autentica un cliente tradicionalmente?
Para acceder a un endpoint privado, el cliente primero debe solicitar al servidor la autenticación. Normalmente, esto se lleva a cabo mediante un formulario de usuario y contraseña. A través de una solicitud tipo POST se pide un token al servidor que funciona como una tarjeta de acceso. Para obtener este token, se realiza un proceso de autenticación tipo "Basic", donde se envían el usuario y la contraseña concatenados y codificados en Base64. Si el servidor valida correctamente las credenciales, devuelve el token.
¿Cuál es el procedimiento para usar el token?
Una vez que el cliente tiene el token, puede hacer solicitudes a un endpoint privado usando una autorización de tipo "Bearer". Aquí ya no se utiliza usuario y contraseña, sino el token previamente obtenido. Esta autorización se envía en el encabezado de la solicitud. Si el token es válido, el servidor permite el acceso al recurso.
¿Qué importancia tiene el uso de HTTPS en la autenticación?
Cuando se envían credenciales como usuario y contraseña, es crucial que esta información viaje segura a través de la red. La codificación en Base64 es reversible, por lo que no es segura por sí sola. Por esta razón, se debe usar HTTPS, que encripta los datos para evitar que actores maliciosos en la red puedan interceptarlos. Si no se utiliza HTTPS, al enviar credenciales se estaría exponiendo información sensible a posibles ataques.
¿Cómo se implementa en código la protección de un endpoint?
Para ilustrar cómo funciona la protección de un endpoint, se puede usar un servidor Express en Node.js, que define los endpoints públicos y privados. El servidor verifica las credenciales proporcionadas, genera y devuelve un token. Aquí un ejemplo de cómo se cargan y manejan los endpoints en Express:
const express = require('express');
const app = express();
const PORT = process.env.PORT || 3000;
app.get('/public', (req, res) => {
res.send('I am public');
});
app.get('/private', (req, res) => {
const token = req.headers['authorization'];
if (!token) {
return res.status(401).send('Unauthorized');
}
// Aquí iría la lógica de verificación del token...
res.send('I am private');
});
app.post('/token', (req, res) => {
const credentials = getCredentials(req);
if (!credentials) {
return res.status(401).send('Authorization Required');
}
const token = createToken(credentials);
res.json({ token: token });
});
app.listen(PORT, () => {
console.log(`Server is running on port ${PORT}`);
});
¿Cómo se maneja la autenticación en herramientas como Postman?
Usar herramientas como Postman facilita la prueba de endpoints. Para una solicitud de tipo "Bearer", se cargan variables de entorno que contienen el token previamente obtenido, y se configuran los headers necesarios para enviar la autorización adecuada. Esto proporciona un flujo de trabajo más eficiente al probar y verificar la seguridad de la autenticación en el lado del servidor.
¿Qué limitaciones tiene la validación de tokens?
Aunque la validación de tokens es sencilla de implementar cuando se tiene completo control del sistema, se vuelve ineficiente al tratar con usuarios de servicios externos. Aquí es donde entra en juego el open authorization, que permite a servicios de terceros gestionar la autenticación sin necesidad de manejar la base de datos localmente.
Para entender y practicar este concepto, te animo a que crees un diagrama de flujo de un endpoint que desees proteger. Puedes usar herramientas como draw.io o cualquier otra que prefieras. Reflexiona sobre los mecanismos de seguridad que implementarías: ¿usarías token, sesiones, o quizás una palabra secreta? ¡En la próxima clase veremos más sobre open authorization y open ID connect!