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)
GET /api/data HTTP/1.1
Host: api.ejemplo.com
X-API-Key: abc123def456ghi789Características:
Simple pero menos segura
Se envía en header o query parameter
Ejemplo:
?api_key=abc123
2. Bearer Token (JWT - JSON Web Token)
GET /api/user HTTP/1.1
Authorization: Bearer eyJhbGciOiJIUzI1NiIs...Estructura JWT:
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
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/callbackFlujo típico OAuth:
Cliente redirige a proveedor de autenticación
Usuario autoriza aplicación
Recibe
authorization_codeIntercambia código por
access_token
4. Basic Auth
GET /api/protected HTTP/1.1
Authorization: Basic base64(username:password)Ejemplo:
// "user:pass" → base64 → "dXNlcjpwYXNz"
Authorization: Basic dXNlcjpwYXNz📊 Formatos de Body en APIs
1. JSON (Más común - 90% de APIs)
{
"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:
Content-Type: application/json
Accept: application/json2. Form-Data (Para formularios y archivos)
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
POST /api/login HTTP/1.1
Content-Type: application/x-www-form-urlencoded
username=carlos&password=secret123&remember=true4. XML (Legacy/Enterprise)
<?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:
Content-Type: application/xml
Accept: application/xml5. GraphQL (Alternativa a REST)
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
GET /api/products?category=electronics&page=2 HTTP/1.1
Accept: application/jsonCaracterísticas:
Solo headers, sin body (generalmente)
Cacheable
Idempotente (misma petición = misma respuesta)
POST - Crear
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
PUT /api/products/123 HTTP/1.1
Content-Type: application/json
{
"name": "Producto Actualizado",
"price": 149.99,
"stock": 50
}PATCH - Actualización parcial
PATCH /api/products/123 HTTP/1.1
Content-Type: application/json
{
"price": 149.99
}DELETE - Eliminar
DELETE /api/products/123 HTTP/1.1Respuesta común:
204 No Content (éxito sin body)
200 OK con confirmación en body
🎯 Headers Especializados para APIs
Headers de Control de Caché
Cache-Control: no-cache, no-store, must-revalidate
ETag: "33a64df551425fcc55e4d42a148795d9f25f89d4"
Last-Modified: Wed, 21 Oct 2015 07:28:00 GMTHeaders de Seguridad
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)
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: trueHeaders de Rate Limiting
X-RateLimit-Limit: 100
X-RateLimit-Remaining: 99
X-RateLimit-Reset: 1614556800
Retry-After: 60🔄 WebSockets vs HTTP APIs
HTTP API (Request/Response)
CLIENTE: GET /api/messages
SERVIDOR: 200 OK [{mensajes}]WebSocket (Conexión persistente)
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)
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/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
Siempre validar Content-Type recibido
Usar headers de seguridad
Implementar idempotency keys para operaciones críticas
Idempotency-Key: unique-key-per-requestIncluir request IDs para tracking
Usar Accept y Content-Type correctamente
Versionar APIs en headers o URL
Accept: application/vnd.api.v2+json
🔧 Herramientas para Debug
# 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+jsonEn URL:
/api/v2/usersEn query:
?version=2
Comentarios
Publicar un comentario