Pruebas End-to-End con Access Token en API REST
Clase 13 de 25 • Curso de End to End Testing para APIs REST con Node.js
Resumen
¿Cómo se pueden realizar pruebas de rutas protegidas por un access token?
Realizar pruebas de rutas que requieren autenticación es un proceso esencial para garantizar que una aplicación maneje correctamente la seguridad y la privacidad del usuario. En este contexto, los access tokens son fundamentales, ya que actúan como la llave que permite a los usuarios autenticados acceder a recursos protegidos. A continuación, detallamos cómo abordar las pruebas de rutas protegidas utilizando access tokens.
¿Qué es un access token y cómo funciona?
Un access token es un token de acceso que se genera cuando un usuario inicia sesión en una aplicación. Este token es utilizado para validar la sesión y otorgar acceso a ciertas funcionalidades o datos dentro de la aplicación. Funciona de la siguiente manera:
- Generación: El token se genera al iniciar sesión con credenciales válidas (como email y contraseña).
- Uso: Se envía en cada solicitud a rutas protegidas a través de los headers, típicamente en el header 'Authorization'.
- Validación: El sistema verifica la validez del token. Un token inválido resultará en una respuesta de acceso no autorizado (código 401).
¿Cómo realizar pruebas con rutas protegidas?
Para ejecutar pruebas a rutas que requieren un access token, sigue estos pasos:
- Generación del access token: Inicia sesión en la aplicación para obtener un access token válido.
- Configuración del Request: En cada solicitud a rutas protegidas, incluye el access token en el header de la petición. Usa el formato 'Bearer' seguido del token.
- Validación de la respuesta: Verifica que el token permite acceder y devuelve la información correcta del usuario.
Ejemplo de configuración del request en código JavaScript:
const request = require('supertest');
const app = require('./app');
describe('Endpoint protegido', () => {
let accessToken;
beforeAll(async () => {
const loginResponse = await request(app)
.post('/login')
.send({
email: 'usuario@ejemplo.com',
password: 'password123'
});
accessToken = loginResponse.body.accessToken;
});
it('Debería devolver información del usuario autenticado', async () => {
const response = await request(app)
.get('/api/v1/profile/myUser')
.set('Authorization', `Bearer ${accessToken}`);
expect(response.status).toBe(200);
expect(response.body.email).toBe('usuario@ejemplo.com');
});
});
¿Cuáles son las mejores prácticas al realizar pruebas?
Implementar buenas prácticas es crucial para asegurar que las pruebas sean efectivas y mantenibles:
- Usar
beforeAll
para autenticarse: Antes de ejecutar las pruebas, realiza un solo login y reutiliza el access token para todas las pruebas de un conjunto específico. - Pruebas por roles: Realiza pruebas con diferentes tipos de usuarios para verificar que se respeten roles y permisos.
- Reset de estado: Al finalizar las pruebas, utiliza
afterAll
para limpiar el estado, como volver a poner el access token anull
.
¿Cómo manejar pruebas con múltiples roles de usuario?
Cuando se trabaja con aplicaciones que tienen diferentes roles de usuario, como administrador o cliente, es útil estructurar las pruebas para que cada suite pueda manejar un rol diferente. Esto no solo mejora la eficacia de las pruebas, sino que también asegura que las rutas respondan correctamente según los permisos:
- Distintas suites de pruebas: Para cada tipo de usuario, crea una suite de pruebas separada que maneje un acceso y un comportamiento específico, permitiendo validar que el API gestiona correctamente roles y permisos.
- Evaluación continua: Usa herramientas como
npm run
para ejecutar tus pruebas y asegurarte de que el sistema esté en constante revisión.
Implementando estos enfoques, puedes garantizar que las rutas protegidas por tokens de acceso en tu aplicación no solo autenticen correctamente a los usuarios, sino que también mantengan estándares altos de seguridad. Las pruebas bien fundamentadas no solo contribuyen a un código más seguro, sino que también proporcionan una experiencia de usuario más fluida y confiable.