Autenticación en APIs - Métodos y Headers

Autenticación en APIs - Métodos y Headers

📋 Tipos de Autenticación Comunes

1. API Keys (Claves de API)

text
GET /api/data HTTP/1.1
Host: api.ejemplo.com
X-API-Key: abc123def456ghi789

Características:

  • Simple pero menos segura

  • Se envía en header o query parameter

  • Ejemplo: ?api_key=abc123

2. Bearer Token (JWT - JSON Web Token)

text
GET /api/user HTTP/1.1
Authorization: Bearer eyJhbGciOiJIUzI1NiIs...

Estructura JWT:

text
header.payload.signature

# Decodificado:
{
  "header": {
    "alg": "HS256",
    "typ": "JWT"
  },
  "payload": {
    "sub": "1234567890",
    "name": "John Doe",
    "iat": 1516239022,
    "exp": 1516242622
  },
  "signature": "firma_cifrada"
}

3. OAuth 2.0

text
POST /token HTTP/1.1
Content-Type: application/x-www-form-urlencoded

grant_type=authorization_code
&code=AUTH_CODE_123
&client_id=CLIENT_ID
&client_secret=CLIENT_SECRET
&redirect_uri=https://app.com/callback

Flujo típico OAuth:

  1. Cliente redirige a proveedor de autenticación

  2. Usuario autoriza aplicación

  3. Recibe authorization_code

  4. Intercambia código por access_token

4. Basic Auth

text
GET /api/protected HTTP/1.1
Authorization: Basic base64(username:password)

Ejemplo:

javascript
// "user:pass" → base64 → "dXNlcjpwYXNz"
Authorization: Basic dXNlcjpwYXNz

📊 Formatos de Body en APIs

1. JSON (Más común - 90% de APIs)

json
{
  "user": {
    "id": 1,
    "name": "Carlos",
    "email": "carlos@email.com",
    "settings": {
      "theme": "dark",
      "notifications": true
    }
  },
  "metadata": {
    "version": "1.0",
    "timestamp": "2024-03-15T12:00:00Z"
  }
}

Headers específicos:

text
Content-Type: application/json
Accept: application/json

2. Form-Data (Para formularios y archivos)

text
POST /api/upload HTTP/1.1
Content-Type: multipart/form-data; boundary=----Boundary123

------Boundary123
Content-Disposition: form-data; name="username"

Carlos
------Boundary123
Content-Disposition: form-data; name="avatar"; filename="foto.jpg"
Content-Type: image/jpeg

[binary data del archivo]
------Boundary123--

3. x-www-form-urlencoded

text
POST /api/login HTTP/1.1
Content-Type: application/x-www-form-urlencoded

username=carlos&password=secret123&remember=true

4. XML (Legacy/Enterprise)

xml
<?xml version="1.0" encoding="UTF-8"?>
<user>
  <id>1</id>
  <name>Carlos</name>
  <email>carlos@email.com</email>
  <settings>
    <theme>dark</theme>
    <notifications>true</notifications>
  </settings>
</user>

Headers:

text
Content-Type: application/xml
Accept: application/xml

5. GraphQL (Alternativa a REST)

text
POST /graphql HTTP/1.1
Content-Type: application/json

{
  "query": "query GetUser($id: ID!) { user(id: $id) { name email posts { title } } }",
  "variables": { "id": "123" }
}

🛠️ Métodos HTTP y su Uso en APIs

GET - Leer/Consultar

http
GET /api/products?category=electronics&page=2 HTTP/1.1
Accept: application/json

Características:

  • Solo headers, sin body (generalmente)

  • Cacheable

  • Idempotente (misma petición = misma respuesta)

POST - Crear

http
POST /api/products HTTP/1.1
Content-Type: application/json

{
  "name": "Nuevo Producto",
  "price": 99.99,
  "stock": 100
}

Características:

  • Siempre lleva body

  • No idempotente (cada POST crea nuevo recurso)

  • Respuesta: 201 Created + Location header

PUT - Reemplazar/Actualizar completo

http
PUT /api/products/123 HTTP/1.1
Content-Type: application/json

{
  "name": "Producto Actualizado",
  "price": 149.99,
  "stock": 50
}

PATCH - Actualización parcial

http
PATCH /api/products/123 HTTP/1.1
Content-Type: application/json

{
  "price": 149.99
}

DELETE - Eliminar

http
DELETE /api/products/123 HTTP/1.1

Respuesta común:

  • 204 No Content (éxito sin body)

  • 200 OK con confirmación en body

🎯 Headers Especializados para APIs

Headers de Control de Caché

text
Cache-Control: no-cache, no-store, must-revalidate
ETag: "33a64df551425fcc55e4d42a148795d9f25f89d4"
Last-Modified: Wed, 21 Oct 2015 07:28:00 GMT

Headers de Seguridad

text
Strict-Transport-Security: max-age=31536000; includeSubDomains
X-Content-Type-Options: nosniff
X-Frame-Options: DENY
Content-Security-Policy: default-src 'self'

Headers para CORS (Cross-Origin)

text
Access-Control-Allow-Origin: https://mi-frontend.com
Access-Control-Allow-Methods: GET, POST, PUT, DELETE
Access-Control-Allow-Headers: Content-Type, Authorization
Access-Control-Allow-Credentials: true

Headers de Rate Limiting

text
X-RateLimit-Limit: 100
X-RateLimit-Remaining: 99
X-RateLimit-Reset: 1614556800
Retry-After: 60

🔄 WebSockets vs HTTP APIs

HTTP API (Request/Response)

text
CLIENTE: GET /api/messages
SERVIDOR: 200 OK [{mensajes}]

WebSocket (Conexión persistente)

text
CLIENTE: ws://api.com/chat
SERVIDOR: Conexión establecida

CLIENTE: {"type": "message", "text": "Hola"}
SERVIDOR: {"type": "message", "user": "Bot", "text": "Hola!"}

📝 Ejemplo Completo - API de E-commerce

Crear Pedido (POST)

http
POST /api/orders HTTP/1.1
Host: api.tienda.com
Content-Type: application/json
Authorization: Bearer eyJhbGciOiJIUz...
X-Request-ID: 550e8400-e29b-41d4-a716-446655440000
Accept: application/json
Accept-Language: es-ES

{
  "customer_id": "cust_123",
  "items": [
    {
      "product_id": "prod_456",
      "quantity": 2,
      "price": 29.99
    }
  ],
  "shipping_address": {
    "street": "Calle Principal 123",
    "city": "Madrid",
    "zip_code": "28001"
  },
  "metadata": {
    "source": "mobile_app",
    "version": "2.1.0"
  }
}

Respuesta Exitosa

http
HTTP/1.1 201 Created
Content-Type: application/json
X-Request-ID: 550e8400-e29b-41d4-a716-446655440000
Location: https://api.tienda.com/api/orders/ord_789
RateLimit-Limit: 1000
RateLimit-Remaining: 999

{
  "success": true,
  "data": {
    "order": {
      "id": "ord_789",
      "customer_id": "cust_123",
      "total": 59.98,
      "status": "pending",
      "created_at": "2024-03-15T14:30:00Z",
      "estimated_delivery": "2024-03-20"
    }
  },
  "links": {
    "self": "/api/orders/ord_789",
    "payment": "/api/orders/ord_789/payment"
  }
}

🛡️ Buenas Prácticas en Headers de APIs

  1. Siempre validar Content-Type recibido

  2. Usar headers de seguridad

  3. Implementar idempotency keys para operaciones críticas

    text
    Idempotency-Key: unique-key-per-request
  4. Incluir request IDs para tracking

  5. Usar Accept y Content-Type correctamente

  6. Versionar APIs en headers o URL

    text
    Accept: application/vnd.api.v2+json

🔧 Herramientas para Debug

bash
# cURL detallado
curl -v -X POST https://api.ejemplo.com/endpoint \
     -H "Content-Type: application/json" \
     -d '{"test": "data"}'

# HTTPie (más legible)
http POST api.ejemplo.com/endpoint \
     Authorization:"Bearer token" \
     test="data"

# Ver solo headers
curl -I https://api.ejemplo.com/endpoint

❓ Preguntas Comunes

¿Dónde va el token JWT?

  • En el header: Authorization: Bearer <token>

¿JSON vs Form-Data?

  • JSON para objetos complejos

  • Form-Data para archivos y formularios HTML

¿GET con body?

  • Técnicamente posible, pero mala práctica

  • Usar query parameters en su lugar

¿Cómo versionar APIs?

  • En header: Accept: application/vnd.api.v2+json

  • En URL: /api/v2/users

  • En query: ?version=2

Comentarios

Entradas populares de este blog

¿Qué es el Modelo OSI?

bit -El codigo ASCII

38. Tema 1: Protocolos de comunicación.