Lección 7 de 20 · Lectura y práctica
Usar Contexto para Autenticación y Autorización
Tipo de lección: VideoConcepto claveEl contexto en GraphQL es un objeto que se pasa a todos los resolvers durante la ejecución de una operación. Piensa en el contexto como el "equipaje de mano" que cada resolver lleva consigo.
Del concepto a la práctica
Taller de esta lección
El contexto debe transportar la identidad ya interpretada de la solicitud, no una confianza ciega en un identificador enviado como argumento. Autenticación responde quién es la persona; autorización decide si puede actuar sobre el recurso concreto.
Ejemplo resuelto
Una mutación renameBoard(id, name) recibe context.user = { id: "u1", role: "member" }. El tablero b1 pertenece a u1 y b2 a u2. u1 puede renombrar b1, pero no b2; un contexto sin usuario no puede renombrar ninguno.
Construye el contexto a partir de una sesión o token verificado del entorno local.
Rechaza ausencia de identidad antes de cargar datos sensibles.
Busca el tablero por
args.id.Compara
board.ownerIdconcontext.user.idantes de actualizar.
Error frecuente: autorizar porque el cliente envió ownerId: "u1". Corrección: ignora ese dato para permisos y usa la identidad derivada del contexto.
Pruébalo
Prueba u1 sobre b1, u1 sobre b2 y una solicitud sin usuario.
Comprueba tu resultado
Solo la primera operación cambia el nombre; las otras dos fallan con categorías de acceso distinguibles y ningún tablero se modifica.
Una cabecera no prueba una identidad
Una cabecera X-User-Id enviada libremente solo puede servir como doble de autenticación claramente separado en el laboratorio. El servicio real verifica firma, caducidad y estado de la sesión antes de construir context.user. La lectura del tablero se limita al equipo autorizado y la actualización se ejecuta con esa condición en el almacén. Devuelve categorías públicas de no autenticado y denegado sin exponer metadatos del tablero ajeno; las credenciales nunca aparecen en tipos GraphQL ni en trazas públicas.

Mapa de prácticaEl navegador envía una solicitud a la API. El servidor valida la operación y consulta los datos; después devuelve una respuesta que el navegador puede mostrar. La base de datos se comunica con el servidor y no directamente con el navegador.
Ver la infografía en tamaño completo ↗Fuentes para profundizar
Tipo de lección: Video
Concepto clave
El contexto en GraphQL es un objeto que se pasa a todos los resolvers durante la ejecución de una operación. Piensa en el contexto como el "equipaje de mano" que cada resolver lleva consigo durante todo el viaje de una solicitud GraphQL. A diferencia de los argumentos, que son específicos para cada campo, el contexto es compartido globalmente.
En el mundo real, imagina que estás en un hotel: el contexto sería tu llave de habitación. Con ella, puedes acceder a áreas restringidas (autorización) y el personal sabe quién eres (autenticación). Sin ella, solo puedes usar las áreas públicas. En GraphQL, usamos el contexto principalmente para dos propósitos: autenticación (verificar quién es el usuario) y autorización (determinar qué puede hacer ese usuario).
Cómo funciona en la práctica
En Apollo Server con Next.js, configuramos el contexto en la creación del servidor. Este contexto se genera por cada solicitud, permitiéndote inyectar datos como tokens de autenticación, conexiones a bases de datos, o servicios externos. Aquí un ejemplo paso a paso:
- Configura Apollo Server en tu API route de Next.js (ejemplo:
/pages/api/graphql.js). - Define una función de contexto que extraiga el token del header de la solicitud HTTP.
- Verifica el token usando un servicio como JWT (JSON Web Token).
- Adjunta el usuario autenticado al objeto contexto.
- En tus resolvers, accede al contexto para tomar decisiones de autorización.
Ejemplo de código básico:
const server = new ApolloServer({
typeDefs,
resolvers,
context: async ({ req }) => {
const token = req.headers.authorization || '';
const user = await verifyToken(token);
return { user };
}
});Caso de estudio
Imagina que estás construyendo una API para un sistema de blogs. Tienes dos tipos de usuarios: lectores (pueden ver posts) y editores (pueden crear y editar posts). Usaremos contexto para manejar esto. Primero, definimos un esquema GraphQL:
type Mutation {
createPost(title: String!, content: String!): Post
}
type Query {
posts: [Post]
}Luego, en el resolver de createPost, verificamos el contexto:
Mutation: {
createPost: async (parent, args, context) => {
if (!context.user) {
throw new Error('No autenticado');
}
if (context.user.role !== 'editor') {
throw new Error('No autorizado');
}
return await createPostInDB(args.title, args.content);
}
}En este caso, si un usuario no está en el contexto o no tiene rol de editor, la mutación falla con un error claro. Esto previene accesos no deseados y mantiene la seguridad.
Errores comunes
- Exponer datos sensibles en el contexto: No almacenes contraseñas o claves privadas directamente. Usa tokens o referencias.
- No validar el contexto en cada resolver relevante: Asumir que un resolver anterior ya hizo la validación puede llevar a vulnerabilidades. Siempre verifica en el punto de uso.
- Usar contexto para datos volátiles o de sesión de corta duración: El contexto es por solicitud, no para estado persistente. Para eso, usa bases de datos o caché.
- Ignorar el manejo de errores en la función de contexto: Si la autenticación falla, debes manejarlo graciosamente, no crashear el servidor.
- Sobrecargar el contexto con demasiados datos: Mantenlo ligero; solo incluye lo necesario para autenticación y autorización.
Checklist de dominio
- Configurar Apollo Server con una función de contexto que extraiga tokens de headers HTTP.
- Implementar lógica de autenticación (ej., verificar JWT) y adjuntar usuario al contexto.
- Usar el contexto en resolvers para verificar autorización basada en roles o permisos.
- Manejar errores de autenticación/autorización con mensajes claros en GraphQL.
- Probar la API con diferentes usuarios (autenticados vs. no autenticados, diferentes roles).
- Optimizar el contexto para no incluir datos innecesarios que afecten el rendimiento.
- Documentar los requisitos de contexto para los consumidores de la API.
Implementar autenticacion y autorizacion en una API de tareas
En este ejercicio, practicaras el uso de contexto para proteger una API GraphQL de tareas. Sigue estos pasos:
- Crea un nuevo proyecto Next.js con Apollo Server si no tienes uno.
- Define un esquema GraphQL con tipos
Task(id, title, description, userId) y mutaciones comocreateTaskydeleteTask. - Configura Apollo Server con una funcion de contexto que simule autenticacion: extrae un header
Authorizationcon un token simple (ej., "user123") y asigna un usuario al contexto. - Implementa resolvers para las mutaciones que verifiquen:
- Para
createTask: el usuario debe estar autenticado (contexto tiene usuario). - Para
deleteTask: solo el dueno de la tarea (comparar userId en la tarea con contexto.user.id) puede eliminarla.
- Para
- Prueba la API usando una herramienta como GraphQL Playground o Insomnia, enviando headers con y sin token.
Pistas
- Usa un objeto simple para simular usuarios, ej., { id: 'user123', role: 'user' } en el contexto.
- En la mutacion deleteTask, primero recupera la tarea de la base de datos simulada para obtener su userId antes de verificar.
Evalua tu comprension
Completa el quiz interactivo de arriba para ganar XP.
Sigue con GraphQL Profesional con Next.js y Apollo Server: APIs Tipadas y Suscripciones
Esta lección forma parte de un curso de Cursalo. Revisa su programa y elige entre la compra individual o el acceso a toda la escuela.
Si ya tenías acceso a este curso, entra con tu cuenta: tus derechos y tu progreso se conservan. No necesitas comprarlo de nuevo.