Contenido del curso
Parámetros y Validación
CRUD en FastAPI
Arquitectura en FastAPI
Bases de Datos y Consultas
Middlewares
Unit Testing
Seguridad y Autenticación
Autenticación básica en endpoints de FastAPI
Resumen
Proteger los datos es una de las prioridades cuando construyes una API. FastAPI ofrece mecanismos de autenticación que te permiten resguardar tus endpoints con usuario y contraseña, y aquí aprenderás a implementarlo usando HTTP Basic Credentials, ideal para desarrolladores backend que quieren añadir una capa rápida de seguridad.
¿Qué es HTTP Basic Credentials en FastAPI?
Es una dependencia que despliega un login nativo en tu documentación automática para pedir usuario y contraseña antes de ejecutar un endpoint. Cuando el usuario se autentica, los valores quedan disponibles dentro de tu función para que los valides contra tu base de datos o lógica de negocio.
¿Cuál es la forma más rápida de proteger un endpoint en FastAPI? Usar HTTPBasic como dependencia. Te entrega un objeto con
usernameypasswordque puedes validar antes de retornar la respuesta. [0:30]
En la documentación interactiva que genera FastAPI, los endpoints sin protección se ejecutan directamente con el botón Try out. Al añadir esta dependencia aparece un nuevo botón de autorización y un candado junto al endpoint protegido.
¿Cómo agregar autenticación a un endpoint con Depends y HTTPBasic?
La autenticación se inyecta como una dependencia dentro de los parámetros de la función. FastAPI distingue entre parámetros de entrada del usuario y dependencias según el tipo que declares.
Configuración inicial de la dependencia de seguridad
Primero defines el esquema de seguridad y luego lo inyectas usando Depends junto con Annotated para que el autocompletado funcione correctamente.
- Importa
HTTPBasicyHTTPBasicCredentialsdesdefastapi.security. [2:10] - Importa
DependsyAnnotateddesdefastapiytyping. - Crea la instancia:
security = HTTPBasic(). - Declara el parámetro:
credentials: Annotated[HTTPBasicCredentials, Depends(security)].
Con esta declaración, cada vez que un usuario se loguee desde la documentación, la variable credentials se llenará automáticamente con el username y password ingresados. Esto te ahorra tener que parsear cabeceras manualmente.
Validación del usuario y la contraseña
Una vez tienes las credenciales, el siguiente paso es comprobar si coinciden con un usuario válido. En el ejemplo se simula la validación con un if, pero en producción consultarías la base de datos.
python from typing import Annotated from fastapi import FastAPI, Depends, HTTPException, status from fastapi.security import HTTPBasic, HTTPBasicCredentials
app = FastAPI() security = HTTPBasic()
@app.get("/") def root(credentials: Annotated[HTTPBasicCredentials, Depends(security)]): if credentials.username == "lmmartinez" and credentials.password == "qwerty": return {"message": f"Hola, {credentials.username}"} raise HTTPException( status_code=status.HTTP_401_UNAUTHORIZED, detail="No está autorizado para acceder a este endpoint" )
Si las credenciales son incorrectas, lanzas un HTTPException con código 401 Unauthorized, que es el estándar para indicar falta de autenticación válida. [5:40]
¿Por qué usar Annotated al declarar dependencias?
Sin Annotated, el editor marca un error indicando que no puede invocar la expresión. Al envolver el tipo y la dependencia dentro de Annotated, FastAPI interpreta correctamente la inyección y tu IDE te ofrece autocompletado sobre credentials.username y credentials.password.
¿Qué hace Depends en FastAPI? Marca un parámetro como dependencia para que FastAPI lo resuelva antes de ejecutar la función, en lugar de tratarlo como entrada del cliente. [1:50]
Esto es lo que permite que credentials se comporte como un objeto inyectado y no como un query param o body que el usuario tendría que enviar manualmente.
¿Cómo se ve la autenticación en la documentación de FastAPI?
Al ejecutar la aplicación y recargar /docs, aparece un botón Authorize en la parte superior. Al hacer clic, FastAPI muestra un formulario para ingresar usuario y contraseña.
- Si ingresas credenciales válidas, el endpoint responde con el mensaje personalizado, por ejemplo
Hola, lmmartinez. - Si ingresas credenciales incorrectas, recibes un response con el detalle
No está autorizado para acceder a este endpoint. - Cada ventana de incógnito mantiene su propia sesión, lo que facilita probar distintos usuarios. [4:20]
El candado junto al endpoint cambia de estado para indicar visualmente cuáles rutas están protegidas y cuáles no.
Buenas prácticas al implementar autenticación básica
La autenticación básica es un buen punto de partida, pero conviene reforzarla con prácticas de seguridad sólidas desde el inicio del proyecto.
- Nunca dejes contraseñas escritas directamente en el código fuente; usa variables de entorno o un gestor de secretos.
- Compara contraseñas usando funciones de tiempo constante como
secrets.compare_digestpara evitar ataques de tiempo. - Considera migrar a OAuth2 o JWT cuando necesites manejar sesiones, expiración de tokens o roles.
- Aplica la misma dependencia a todos los endpoints sensibles para mantener una política de acceso uniforme.
Como reto práctico, replica esta autenticación en el resto de endpoints de tu API y mueve la contraseña fuera del archivo principal usando environment variables. ¿Cómo resolverías la validación contra una base de datos real en tu proyecto? Cuéntalo en los comentarios.