Este proyecto es una API desarrollada con FastAPI que incluye rutas para gestionar personajes y elementos. Utiliza SQLAlchemy para la interacción con la base de datos y Pydantic para la validación de datos.
Antes de ejecutar el proyecto, asegúrate de tener instalados los siguientes componentes:
- Python 3.11 o superior
- pip
- virtualenv
- Un servidor de base de datos SQL Server
-
Clona este repositorio en tu máquina local:
git clone <URL_DEL_REPOSITORIO> cd <NOMBRE_DEL_PROYECTO>
-
Crea un entorno virtual (opcional pero recomendado):
python -m venv venv source venv/bin/activate # En Windows: venv\Scripts\activate
-
Instala las dependencias del proyecto:
pip install -r requirements.txt
-
Configura las variables de entorno en el archivo
.env:DB_NAME= DB_UID= DB_PASS= DB_PORT= DB_SERVER= ENVIRONMENT=
Inicia el servidor de desarrollo:
uvicorn main:app --reloadAccede a la documentación interactiva de la API en tu navegador:
- Swagger UI: http://127.0.0.1:8000/docs
- Redoc: http://127.0.0.1:8000/redoc
app/
├── api/
│ ├── models/
│ │ └── characters.py
│ ├── routers/
│ │ ├── characters_router.py
│ │ └── item_router.py
│ └── router.py
├── config/
│ ├── db_config.py
│ └── init_db.py
├── schemas/
│ └── item_schemas.py
├── services/
│ ├── character_services.py
│ └── item_service.py
├── main.py
└── .env
Este proyecto utiliza GitHub Actions para implementar un flujo de trabajo de CI/CD que automatiza las pruebas y el despliegue en una Azure Web App.
-
Configuración de GitHub Actions:
- El archivo de flujo de trabajo se encuentra en
.github/workflows/ci-cd.yml. - Ejecuta pruebas automáticamente y despliega la aplicación en Azure Web App al realizar un push o pull request en la rama
main.
- El archivo de flujo de trabajo se encuentra en
-
Configuración de Azure Web App:
- Crea una Azure Web App con el runtime Python 3.11.
- Descarga el perfil de publicación y configúralo como un secreto en GitHub (
AZURE_WEBAPP_PUBLISH_PROFILE).
-
Despliegue Automático:
- Los cambios en la rama
mainactivan el flujo de trabajo de GitHub Actions. - La aplicación se despliega automáticamente en la Azure Web App configurada.
- Los cambios en la rama
- Utiliza el portal de Azure para monitorear el estado de la Web App.
- Los logs de GitHub Actions están disponibles en la pestaña Actions del repositorio.
- Optimiza el flujo de trabajo de CI/CD ajustando los pasos según las necesidades del proyecto.
- Implementa pruebas adicionales para garantizar la calidad del código.
- POST /auth/register: Registra un nuevo usuario.
- POST /auth/login: Autentica un usuario y devuelve un JWT.
- Rutas GET: Requieren un JWT válido.
- Rutas POST/PUT: Requieren un JWT válido y que el usuario sea de tipo
Admin.
- Registra tu aplicación en Google Cloud Platform.
- Configura las credenciales OAuth 2.0 y obtén el Client ID y el Client Secret.
- Agrega los valores al archivo
.env:GOOGLE_CLIENT_ID=your_google_client_id GOOGLE_CLIENT_SECRET=your_google_client_secret
- GET /auth/google/login: Redirige al usuario al flujo de autenticación de Google.
- GET /auth/google/callback: Maneja el callback de Google y registra o autentica al usuario.
Este proyecto incluye un pequeño frontend integrado utilizando Jinja2 para facilitar la interacción con las funcionalidades de la API. El frontend permite probar las siguientes características:
-
Inicio:
- Página de bienvenida con enlaces de navegación.
- URL: http://127.0.0.1:8000/
-
Gestión de personajes:
- Listar todos los personajes con sus atributos (
Name,Height,Mass,Hair Color,Skin Color,Eye Color). - Agregar nuevos personajes mediante un formulario.
- URL: http://127.0.0.1:8000/characters
- Listar todos los personajes con sus atributos (
-
Inicio de sesión:
- Formulario para iniciar sesión con un usuario registrado.
- URL: http://127.0.0.1:8000/auth/login
-
Inicio de sesión con Google:
- Redirección al flujo de autenticación de Google.
- URL: http://127.0.0.1:8000/auth/google/login
Las plantillas HTML están ubicadas en el directorio templates/ y utilizan Jinja2 para renderizar contenido dinámico.
app/
├── templates/
│ ├── base.html # Plantilla base con el diseño principal
│ ├── index.html # Página de inicio
│ ├── characters.html # Página para listar y agregar personajes
│ ├── login.html # Página de inicio de sesión
-
Inicia el servidor:
uvicorn main:app --reload
-
Accede a las páginas en tu navegador:
- Página de inicio: http://127.0.0.1:8000/
- Listar y agregar personajes: http://127.0.0.1:8000/characters
- Formulario de inicio de sesión: http://127.0.0.1:8000/auth/login
- Login con Google: http://127.0.0.1:8000/auth/google/login
- Estilos personalizados: Puedes agregar un directorio
static/para incluir archivos CSS y JS si deseas personalizar el diseño. - Extensibilidad: Este frontend es básico y puede ser extendido para incluir más funcionalidades según sea necesario.
Para facilitar las pruebas de la API, se incluye una colección de Postman en el archivo collection.json. Puedes importarla en Postman siguiendo estos pasos:
- Abre Postman.
- Haz clic en Importar.
- Selecciona el archivo
collection.jsonubicado en la raíz del proyecto. - Una vez importada, podrás probar las rutas de la API directamente desde Postman.
-
Registro de usuarios:
- POST /auth/register: Registra un nuevo usuario.
-
Inicio de sesión:
- POST /auth/login: Autentica un usuario y devuelve un JWT.
-
Autenticación con Google:
- GET /auth/google/login: Redirige al usuario al flujo de autenticación de Google.
- GET /auth/google/callback: Maneja el callback de Google y registra o autentica al usuario.
-
Gestión de personajes:
- GET /api/characters: Obtiene todos los personajes.
- GET /api/characters/{name}: Obtiene un personaje por su nombre.
- POST /api/characters: Crea un nuevo personaje.
- DELETE /api/characters/{character_id}: Elimina un personaje por su ID.
-
Gestión de ítems:
- GET /api/items/getAll: Obtiene todos los ítems.
- GET /api/items/get/{name}: Obtiene un ítem por su nombre.
- POST /api/items/add: Crea un nuevo ítem.
- DELETE /api/items/delete/{id}: Elimina un ítem por su ID.
-
Configurar variables de entorno en Postman:
- Define una variable
{{access_token}}para almacenar el token JWT obtenido al iniciar sesión. - Usa esta variable en el encabezado
AuthorizationcomoBearer {{access_token}}.
- Define una variable
-
Probar las rutas:
- Usa las rutas incluidas en la colección para probar las funcionalidades de la API, incluyendo la autenticación con Google.
-
Notas adicionales:
- Asegúrate de que el servidor esté corriendo antes de realizar las pruebas:
uvicorn main:app --reload
- Si estás probando la autenticación con Google, asegúrate de haber configurado correctamente las credenciales en el archivo
.env.
- Asegúrate de que el servidor esté corriendo antes de realizar las pruebas:
Este proyecto incluye medidas de seguridad para proteger la aplicación contra ataques comunes:
Se han configurado los siguientes encabezados de seguridad utilizando la biblioteca secure:
- Content-Security-Policy (CSP): Restringe las fuentes de contenido permitidas.
- X-Frame-Options: Previene ataques de clickjacking.
- Strict-Transport-Security (HSTS): Fuerza el uso de HTTPS.
- X-Content-Type-Options: Previene la interpretación errónea de tipos MIME.
- Referrer-Policy: Controla la información enviada en el encabezado Referer.
Se ha implementado rate limiting utilizando la biblioteca slowapi para prevenir ataques de fuerza bruta:
- Rutas protegidas:
/characters: Máximo 5 solicitudes por minuto./auth/login: Máximo 3 intentos de inicio de sesión por minuto.
- Encabezados de seguridad:
- Despliega la aplicación y verifica los encabezados en https://securityheaders.com/.
- Rate limiting:
- Realiza múltiples solicitudes a las rutas protegidas para verificar que se limite el acceso después de alcanzar el límite configurado.