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
| Palabra | Qué significa | Ejemplo |
|---|---|---|
| Clave de API | un texto secreto que identifica a una aplicación | |
| Token | un texto que prueba quién eres y caduca | Bearer abc123 |
| Caducidad | el momento a partir del cual un token ya no vale | |
| Límite de peticiones | el máximo de peticiones que se aceptan en un tiempo | |
| Cubo de fichas | un 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é ocurre | Respuesta |
|---|---|---|
| 1000 | Se emite el token, vale 900 s | - |
| 1500 | Pide con el token | 200 |
| 1900 | El token caduca | - |
| 2000 | Pide con el token | 401 |
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
export PGPASSWORD=shopSe 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
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
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
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
printf '{"alg":"HS256","typ":"JWT"}' | base64Se 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 segundo | Fichas antes | Respuesta | Fichas después |
|---|---|---|---|
| 0 | 3 | 200 | 2 |
| 0 | 2 | 200 | 1 |
| 0 | 1 | 200 | 0 |
| 0 | 0 | 429 | 0 |
| 1 | 1 | 200 | 0 |
| 1 | 0 | 429 | 0 |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.
Enviar tres peticiones seguidas
for i in 1 2 3; do curl -s -o /dev/null -w "%{http_code} " "http://api:3000/books"; done; echoSe muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.