Autenticación y Secretos¶
Estado verificado al 28 de marzo de 2026. Nota de runtime: FastFN auto-instala dependencias locales por función desde
requirements.txt/package.json; enfastfn dev --nativenecesitas runtimes instalados en host, mientras quefastfn devdepende de Docker daemon activo. En FastFN, la seguridad se maneja en el código. Tenés acceso total a headers, variables de entorno y el contexto de la petición para implementar cualquier estrategia de autenticación.
1. Almacenar Secretos (Variables de Entorno)¶
Nunca escribas claves de API (API keys) o contraseñas de base de datos directamente en tu handler.py o index.js.
En su lugar, usa un archivo fn.env.json en la carpeta de la función.
Archivo: functions/api-segura/fn.env.json
{
"API_SECRET": {"value": "clave-super-secreta-123", "is_secret": true},
"DB_PASSWORD": {"value": "contrasenia-correcta", "is_secret": true}
}
La plataforma inyecta estos automáticamente en event['env'] (Python) o event.env (Node.js).
2. Implementar Auth con API Key¶
Este es el patrón más común para comunicación servidor-a-servidor.
Archivo: functions/api-segura/handler.py
import json
def handler(event):
headers = event.get('headers', {})
env = event.get('env', {})
# 1. Recuperar la clave provista (OpenResty minúsculiza los headers)
provided_key = headers.get('x-api-key')
# 2. Comparar con el secreto esperado
expected_key = env.get('API_SECRET')
if not provided_key or provided_key != expected_key:
return {
"status": 401,
"headers": {"Content-Type": "application/json"},
"body": json.dumps({"error": "No Autorizado: API Key inválida"})
}
return {
"status": 200,
"headers": {"Content-Type": "application/json"},
"body": json.dumps({"message": "¡Estás dentro!"})
}
Pruébalo:
# Fallo
curl -i 'http://127.0.0.1:8080/api-segura'
# Éxito
curl -i 'http://127.0.0.1:8080/api-segura' \
-H 'x-api-key: clave-super-secreta-123'
3. Autenticación Básica (Usuario/Contraseña)¶
Manejando el header estándar Authorization: Basic <base64>.
Archivo: functions/auth-basica/index.js
exports.handler = async (event) => {
const headers = event.headers || {};
const auth = headers['authorization'];
if (!auth || !auth.startsWith('Basic ')) {
return {
status: 401,
headers: { 'WWW-Authenticate': 'Basic realm="Area Segura"' },
body: JSON.stringify({ error: "Falta Auth Básica" })
};
}
// Decodificar Base64
const base64Credentials = auth.split(' ')[1];
const credentials = Buffer.from(base64Credentials, 'base64').toString('ascii');
const [username, password] = credentials.split(':');
if (username === 'admin' && password === 'secreto123') {
return {
status: 200,
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ message: "¡Bienvenido, Admin!" })
};
}
return {
status: 403,
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ error: "Prohibido" })
};
};
4. Evitar Fugas de Datos Sensibles¶
Revisar tus logs es importante. Por defecto, FastFN registra detalles de ejecución.
No imprimas secretos
Evita código como print(env) o console.log(event.env).
Si necesitas depurar, imprime solo claves seguras o valores enmascarados.
# BIEN
print(f"Auth check: clave_provista={bool(provided_key)}")
# MAL
print(f"Auth check: clave={provided_key}")
Diagrama de Flujo¶
flowchart LR
A["Request del cliente"] --> B["Discovery de rutas"]
B --> C["Validación de políticas y método"]
C --> D["Ejecución del handler runtime"]
D --> E["Respuesta HTTP + paridad OpenAPI"]
Objetivo¶
Alcance claro, resultado esperado y público al que aplica esta guía.
Prerrequisitos¶
- CLI de FastFN disponible
- Dependencias por modo verificadas (Docker para
fastfn dev, OpenResty+runtimes parafastfn dev --native)
Checklist de Validación¶
- Los comandos de ejemplo devuelven estados esperados
- Las rutas aparecen en OpenAPI cuando aplica
- Las referencias del final son navegables
Solución de Problemas¶
- Si un runtime cae, valida dependencias de host y endpoint de health
- Si faltan rutas, vuelve a ejecutar discovery y revisa layout de carpetas