¿Te resulta más fácil leer con fondo crema, un tono de color, más contraste o un texto más grande? Elige tus colores y tu texto una sola vez, para todas las páginas.

Lección gratuita

Proteger una API con tokens y límites

Después de esta lección: Puedo proteger una API con una clave, un token que caduca y un límite de peticiones.

Lección de 65 min6 comandosLaboratorio de PostgreSQL y PostgREST: una base de datos y una API REST en el navegador

Una API pública sin protección la usa cualquiera

Proteger una API es conseguir que solo la usen quienes deben y que nadie la sature. Para eso se combinan claves, tokens que caducan y límites de peticiones.

Una API de la biblioteca sin ninguna protección deja que cualquier programa lea sus datos, o que un solo programa la tumbe a peticiones.

Al terminar esta lección

Nota

Puedo proteger una API con una clave, un token que caduca y un límite de peticiones.

Palabras clave

PalabraQué significaEjemplo
Clave de APIun texto secreto que identifica a una aplicación
Tokenun texto que prueba quién eres y caducaBearer abc123
Caducidadel momento a partir del cual un token ya no vale
Límite de peticionesel máximo de peticiones que se aceptan en un tiempo
Cubo de fichasun límite que gasta una ficha por petición y repone fichas con el tiempo

Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.

Clave de la aplicación, token de la persona

Una clave de API la recibe un programa al registrarse. Dice qué aplicación pide, y no cambia casi nunca.

Un token se entrega tras iniciar sesión. Dice qué persona pide y caduca pronto. Se envía en la cabecera Authorization, con la palabra Bearer delante. Nunca lo pongas en la dirección, porque las direcciones quedan en los registros.

Ejemplo resuelto: un token que caduca

Momento (s)Qué ocurreRespuesta
1000Se emite el token, vale 900 s-
1500Pide con el token200
1900El token caduca-
2000Pide con el token401

Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.

Un error frecuente

Advertencia

Mucha gente cree que una clave en la dirección, como ?key=abc, es igual de segura que en una cabecera. No lo es. Las direcciones se guardan en registros, historiales y copias. Envía las credenciales en una cabecera.

La API del laboratorio no pide ninguna clave

Esta API de práctica no tiene claves, y por eso solo es segura dentro de tu laboratorio privado. Mira qué pasa sin credenciales y cómo viaja una cabecera.

Prepara primero la tabla books.

Dar a psql la contraseña

Comando
export PGPASSWORD=shop

Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.

Crear la tabla de libros

Comando
psql -h db -U shop -q -c "drop table if exists books; create table books (id serial primary key, title text not null, copies int not null default 1, status text not null default 'disponible'); insert into books (title, copies, status) values ('Redes de computadores', 3, 'disponible'), ('Algoritmos y estructuras', 0, 'prestado'), ('Sistemas operativos', 2, 'disponible'), ('Ingenieria del software', 1, 'disponible'); notify pgrst, 'reload schema'"

Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.

Pedir sin ninguna credencial

Comando
curl -s -o /dev/null -w "%{http_code}\n" "http://api:3000/books"

Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.

Ver cómo viaja un token

Comando
curl -s -v -o /dev/null -H "Authorization: Bearer abc123" "http://api:3000/books" 2>&1 | grep -E "^> Authorization"

Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.

Codificar la cabecera de un token

Comando
printf '{"alg":"HS256","typ":"JWT"}' | base64

Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.

Un cubo de fichas limita las peticiones

El cubo empieza lleno. Cada petición gasta una ficha. Si no queda ninguna, la API responde 429, demasiadas peticiones. Cada segundo se reponen fichas, sin pasar de la capacidad.

Así se permiten ráfagas cortas y se frena a quien insiste.

Ejemplo resuelto: capacidad 3, una ficha por segundo

Petición en el segundoFichas antesRespuestaFichas después
032002
022001
012000
004290
112000
104290

Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.

Enviar tres peticiones seguidas

Comando
for i in 1 2 3; do curl -s -o /dev/null -w "%{http_code} " "http://api:3000/books"; done; echo

Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.

Sobre este laboratorio y su código: Laboratorio de PostgreSQL y PostgREST: una base de datos y una API REST en el navegador

¿Enseñas a una clase? Asigna este módulo a tus alumnos con guía del profesor, tareas con corrección automática y un laboratorio para cada alumno.