Complete "Diseñar y consumir APIs como herramientas de agente" primero para desbloquear esta lección.Ir a la lección anterior

Por qué los agentes necesitan autenticación

Cuando un agente de IA llama a un servicio externo — una base de datos, una API de terceros, una función en la nube — debe demostrar quién es. Esa demostración adopta dos formas comunes: una clave de API estática (una cadena larga y aleatoria que el servicio te emite una vez) o un token de corta duración emitido mediante OAuth 2.0 (un protocolo donde el agente intercambia credenciales por un token de acceso limitado en el tiempo). Ambos cumplen el mismo propósito: el servidor remoto verifica la credencial y luego decide si atiende la solicitud.

El peligro no es la credencial en sí — es lo que ocurre cuando la credencial se filtra. Una clave de API filtrada en un chat log, una traza de error o un prompt enviado a un LLM puede ser rastreada y explotada en cuestión de minutos. Tratar los secretos con tanto cuidado como tratarías la contraseña de una base de datos en producción es la expectativa mínima.

diagrama comparativo de2 flujos de autenticación — clave de API estática adjunta a cada request, y token OAuth otorgado mediante handshake y usado temporalmente

Dónde almacenar los secretos

Nunca hard-codees credenciales en archivos de código fuente. Nunca las pegues en una plantilla de prompt. El patrón estándar es cargarlas desde variables de entorno en tiempo de ejecución, de modo que el secreto viva en el entorno de despliegue, no en el código base.

python
import os
import requests
api_key = os.environ["WEATHER_API_KEY"]
response = requests.get(
"https://api.weather.example.com/v1/current",
headers={"Authorization": f"Bearer {api_key}"}
)

En este snippet la clave se lee desde el entorno, se adjunta como token Bearer en la cabecera HTTP, y nunca se escribe en disco ni se loguea. Si falta la variable de entorno, el agente debe fallar rápido con un error de inicio claro — no recurrir en silencio a un placeholder que enmascare la mala configuración.

Para desarrollo local, un archivo `.env` (un archivo de texto plano con pares clave=valor, excluido del control de versiones mediante `.gitignore`) funciona bien. Para producción, el orquestador o el gestor de secretos inyecta los valores. En cualquier caso, la regla es la misma: los secretos pertenecen fuera del código.

Tokens OAuth y flujo de refresco

Las claves estáticas son simples pero inflexibles. Los tokens OAuth son mejores cuando el agente actúa en nombre de un usuario — por ejemplo, leer su calendario o publicar en su cuenta. El flujo se ve así:

bash
# Step 1: agent receives an authorization code after user consent
# Step 2: exchange code for access token + refresh token
curl -X POST https://auth.example.com/oauth/token \
-d "grant_type=authorization_code" \
-d "code=AUTH_CODE" \
-d "client_id=AGENT_ID" \
-d "client_secret=AGENT_SECRET"
# Step 3: use the access token until it expires, then refresh

El agente debe almacenar el access token solo en memoria, y el refresh token en un almacén seguro. Cuando el access token expira (generalmente señalado por una respuesta 401), el agente lo reemplaza silenciosamente por uno nuevo usando el refresh token — el usuario nunca vuelve a dar su consentimiento. Encapsular la lógica de refresco en una pequeña función auxiliar mantiene limpio el código que la invoca.

Evitar fugas en prompts y logs

La fuga de credenciales más común en sistemas de agentes es el eco accidental: el agente incluye el secreto dentro de un prompt que envía al LLM, o un logger imprime la request completa incluidas las cabeceras. Ambos son fáciles de prevenir una vez que sabes dónde mirar.

python
def build_prompt(user_query: str, context: dict) -> str:
# Never inject credentials into the prompt
safe_context = {k: v for k, v in context.items() if not k.startswith("secret_")}
return f"Context: {safe_context}\nUser: {user_query}"
def safe_log_request(method, url, headers):
# Strip Authorization header before logging
redacted = {k: ("***" if k.lower() == "authorization" else v) for k, v in headers.items()}
print(f"{method} {url} headers={redacted}")

La primera función filtra cualquier campo de contexto cuyo nombre indique un secreto. La segunda redacta la cabecera Authorization antes de imprimir. Aplica el mismo saneamiento a tracebacks, informes de errores y cualquier mensaje de error visible para el usuario — si un stack trace contiene un token, ya lo has perdido.

Resumen

Tres reglas cubren la mayor parte de la superficie. Primero, carga las credenciales desde el entorno, no desde el código ni los prompts. Segundo, prefiere tokens de corta duración sobre claves de larga duración siempre que el servicio soporte OAuth, y refréscalos automáticamente. Tercero, trata cada línea de log, cada mensaje de error y cada prompt como un vector potencial de fuga — redacta antes de escribir. Seguir estas tres reglas no hace que un sistema sea infalible, pero cierra las puertas por las que realmente entran los atacantes.

Práctica de la lección

Punto de control de la lección

Repasa lo aprendido y recibe comentarios sobre tu trabajo.

0/1
Respondidas · 0/1