Protección de Endpoints con Auth0 y Access Tokens
Clase 12 de 28 • Curso de Auth0: Implementación de Autenticación y Seguridad Web
Resumen
¿Cómo proteger un endpoint en Auth0?
Auth0 nos ofrece una solución robusta para proteger endpoints y garantizar un acceso seguro a nuestros servicios. A menudo, hemos tratado solo con autenticación, pero aquí exploraremos cómo implementar la autorización en un endpoint utilizando Auth0. Comenzando por establecer un Audience para nuestra API, permitiremos a Auth0 emitir un Access Token que el proxy server puede validar, garantizando así que solo las solicitudes autenticadas acceden a recursos protegidos.
Además, instalaremos una dependencia clave: express-oauth2-jwt-bidder
, que nos ayudará a validar los Access Tokens desde el proxy server.
¿Cómo se configura el audience y los scopes?
Configurar el audience es fundamental. Al iniciar sesión con Auth0, es importante pasar como audience el identificador de nuestra API para asegurarse de recibir tanto un ID Token como un Access Token.
- Variables de entorno: Define el Auth0 audience y asegúrate de que está configurado correctamente.
- Scopes requeridos: Comúnmente se solicita el perfil y correo electrónico del usuario, pero aquí añadimos los scopes OpenID y RedImage para garantizar que Auth0 entienda exactamente lo que necesita proporcionar.
En términos simples, los scopes son permisos que estás solicitando en nombre del usuario, permitiendo operaciones específicas en la API.
¿Cómo validar el token con Express?
Con la librería express-oauth2-jwt-bidder
, podemos crear una función utilitaria denominada jwt-check
para validar el token recibido.
const jwtCheck = auth({
audience: process.env.AUTH0_AUDIENCE,
issuerBaseURL: process.env.AUTH0_ISSUER_BASE_URL,
});
Aquí, basados en las configuraciones de Auth0, dirigimos nuestro servidor a validar y comprobar los keys públicos necesarios para autenticar el token.
¿Cómo manejar los scopes?
Validar que un token tiene el scope adecuado es tan crucial como validar el token en sí. Utilizamos requireScopes
para preguntar específicamente por el scope que queremos:
const requireScopes = (req, res, next) => {
// Validación del scope requerido.
};
Este middleware se coloca después del path
y antes de la función callback del endpoint para asegurarse de que tanto el token como los scopes son correctos.
Creación de una API protegida en Next.js
La protección de nuestros recursos API en Next.js también es sencilla utilizando Auth0.
- API Endpoint Dinámico: Creamos un nuevo endpoint que recibe un
image ID
.
import { getAccessToken, withApiAuthRequired } from '@auth0/nextjs-auth0';
export default withApiAuthRequired(async function handler(req, res) {
const { imageId } = req.query;
const { accessToken } = await getAccessToken(req, res);
// Fetch y retorno de imágenes.
});
Adaptación del componente con el nuevo endpoint
Basta con actualizar nuestro componente para que apunte al nuevo endpoint:
fetch('/api/images/' + imageId, {
headers: {
Authorization: `Bearer ${accessToken}`,
},
});
Tips y recomendaciones
- Pruebas y Debugging: Utiliza herramientas como Postman para probar tu API y asegurarte de que el Access Token se envía correctamente en el header de autorización.
- Acceder a modelos de usuario: Al iniciar sesión nuevamente después de configurar los nuevos scopes, Auth0 solicitará los permisos adecuados, lo que te permitirá acceder a los datos necesarios.
Con estos pasos claros, animamos a implementar pruebas personalizadas utilizando Postman, garantizando así que tu implementación de Auth0 es efectiva y segura. Si te encuentras con problemas, recuerda revisar los logs para identificar y resolver errores de configuración. ¡Manos a la obra y protege tus endpoints con confianza!