Autenticación y autorización en APIs REST (tokens, API keys, JWT)

1 Introducción

Cuando usamos una API REST, muchas veces necesitamos proteger el acceso:

  • No cualquiera debería poder leer datos sensibles (usuarios, pagos, etc.).
  • No cualquiera debería poder modificar o eliminar recursos.

👉 Para eso existen dos conceptos clave:

  • Autenticación: comprobar quién es el cliente (identidad).
  • Autorización: comprobar qué puede hacer ese cliente (permisos).

Ejemplo

Cuando entrás a tu cuenta de correo, primero te autenticás con usuario y contraseña. Después, según tu rol, podés estar autorizado a leer tus emails pero no los de otra persona.

2 Métodos de autenticación en APIs REST

Existen varios enfoques. Los más comunes son:

1) API Keys

Una API Key es una cadena única que identifica al cliente. Se entrega al usuario cuando se registra en el servicio. Se envía en el header o como parámetro en la URL.

Ejemplo en header

GET /datos HTTP/1.1
Host: api.ejemplo.com
Authorization: ApiKey 12345abcdef

Ejemplo en cURL

curl -H "Authorization: ApiKey 12345abcdef" https://api.ejemplo.com/datos

👉 Son fáciles de usar pero no tan seguras como otros métodos, porque pueden ser robadas si no se transmiten por HTTPS.

2) Tokens de sesión (Bearer Tokens)

Un token es un identificador generado por el servidor al momento de autenticarse (normalmente con usuario + contraseña). El cliente debe incluir este token en cada petición, en el header Authorization.

GET /usuarios/1 HTTP/1.1
Host: api.ejemplo.com
Authorization: Bearer abcdef123456

👉 El prefijo Bearer significa portador, indicando que quien tenga el token puede acceder. Esquema definido en RFC 6750.

3) JWT (JSON Web Tokens)

Un JWT (JSON Web Token) es un estándar muy popular para manejar autenticación y autorización en APIs REST.

Características

  • Es un token en formato JSON codificado en Base64.
  • Está compuesto de 3 partes separadas por puntos: header.payload.signature.
  • Incluye claims (información del usuario, roles, permisos).
  • El servidor no guarda sesión: toda la info viaja en el token — ideal para APIs stateless.

Ejemplo de JWT

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.
eyJ1c2VyaWQiOjEsInJvbCI6ImFkbWluIn0.
h5tG1zX4V4hKc-tZDfPi7dyW4QaU57aV6lzPt-8L9gk
  • Header: tipo de token y algoritmo de firma.
  • Payload: datos (userId, rol, expiración).
  • Signature: garantiza que no fue modificado.

Payload decodificado

{
  "userId": 1,
  "rol": "admin",
  "exp": 1715380000
}

👉 El servidor puede verificar la firma sin necesidad de guardar estado; esto hace a JWT muy eficiente en arquitecturas distribuidas.

3 Flujo típico de autenticación con JWT

  1. El cliente envía usuario + contraseña a /login.
  2. El servidor valida credenciales y devuelve un JWT.
  3. El cliente guarda el token (por ejemplo, en localStorage si es web).
  4. En cada petición, el cliente envía el token en el header: Authorization: Bearer <token>.
  5. El servidor valida la firma del token y revisa los permisos.

4 Ejemplo práctico

Petición de login

POST /login
Content-Type: application/json

{
  "email": "ana@ejemplo.com",
  "password": "12345"
}

Respuesta con token JWT

{
  "token": "eyJhbGciOiJIUzI1NiIsInR..."
}

Uso del token en una petición protegida

GET /pedidos/9001
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR...

👉 Si el token es válido, el servidor devuelve el pedido. Si el token falta o está vencido, responde con 401 Unauthorized.

5 Autenticación vs Autorización

  • Autenticación: validar identidad. Ejemplo: ¿es realmente Ana? (token válido).
  • Autorización: validar permisos. Ejemplo: ¿Ana puede ver pedidos de otros usuarios o solo los suyos?

En muchas APIs, después de autenticar al usuario, se incluyen roles en el token (admin, editor, usuario) para manejar la autorización.

6 Ejemplos en herramientas

En Postman

  • Pestaña Authorization: Tipo: API Key, Bearer Token, o Basic Auth.
  • Se agrega automáticamente al header.

En cURL

curl -X GET https://api.ejemplo.com/usuarios ^
  -H "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR..."

7 Buenas prácticas

  • Siempre usar HTTPS para evitar robo de tokens en tránsito.
  • Nunca guardar contraseñas en texto plano: usar hashing (bcrypt, Argon2).
  • Configurar expiración de tokens (ejemplo: 15 minutos) y renovar con refresh token.
  • Evitar poner tokens en la URL; enviarlos solo en headers.
  • Aplicar autorización por roles y, si es necesario, por permisos granulares.

8 Conclusión del capítulo

La autenticación asegura que el cliente es quien dice ser; la autorización controla qué acciones puede realizar ese cliente.

Métodos comunes: API Keys, Bearer Tokens, JWT.

Los JWT se han convertido en el estándar de facto en APIs REST por ser seguros, livianos y stateless.

👉 En resumen: sin autenticación y autorización, una API REST estaría expuesta a cualquiera y no sería segura.