API REST desarrollada con FastAPI que incluye autenticación OAuth con Google, basada en el proyecto qrry.
- ✅ FastAPI con Python 3.13
- ✅ Autenticación JWT
- ✅ OAuth con Google
- ✅ Base de datos PostgreSQL con SQLAlchemy async
- ✅ Sistema de roles y permisos
- ✅ Docker y Docker Compose
- ✅ CORS configurado
- ✅ Documentación automática con Swagger
api-expo/
├── api/
│ ├── core/
│ │ ├── oauth.py # Configuración OAuth Google
│ │ └── security.py # JWT y autenticación
│ ├── db/
│ │ ├── dependencies.py # Dependencias de DB
│ │ └── session.py # Configuración SQLAlchemy
│ ├── models/
│ │ └── usuario.py # Modelo de Usuario
│ ├── routers/
│ │ ├── auth.py # Endpoints de autenticación
│ │ └── usuarios.py # Endpoints de usuarios
│ ├── schemas/
│ │ └── usuario.py # Esquemas Pydantic
│ └── main.py # Aplicación principal
├── docker-compose.yml
├── Dockerfile
├── requirements.txt
├── .env.example
└── README.md
Copia el archivo .env.example a .env y configura las variables:
cp .env.example .envEdita el archivo .env con tus valores:
# Configuración de la base de datos
DATABASE_URL=postgresql+asyncpg://postgres:password@localhost:5433/apiexpo
# Configuración JWT
SECRET_KEY=tu_clave_secreta_super_segura_aqui
ALGORITHM=HS256
SESSION_SECRET_KEY=otra_clave_secreta_para_sesiones
# Configuración OAuth Google
GOOGLE_CLIENT_ID=tu_google_client_id_aqui
GOOGLE_CLIENT_SECRET=tu_google_client_secret_aqui- Ve a Google Cloud Console
- Crea un nuevo proyecto o selecciona uno existente
- Habilita la API de Google+
- Crea credenciales OAuth 2.0
- Configura las URLs de redirección:
http://localhost:8001/auth/google/callback
# Construir y ejecutar los contenedores
docker-compose up --build
# En modo detached (segundo plano)
docker-compose up -d --build# Crear entorno virtual
python -m venv venv
# Activar entorno virtual
# En Windows:
venv\Scripts\activate
# En Linux/Mac:
source venv/bin/activate
# Instalar dependencias
pip install -r requirements.txt
# Ejecutar la aplicación
cd api
uvicorn main:app --host 0.0.0.0 --port 8000 --reloadUna vez ejecutando, puedes acceder a:
- Swagger UI: http://localhost:8001/docs
- ReDoc: http://localhost:8001/redoc
POST /auth/register- Registrar nuevo usuarioPOST /auth/token- Login con username/passwordGET /auth/me- Obtener usuario actualGET /auth/google/login- Login con GoogleGET /auth/google/callback- Callback OAuth Google
GET /usuarios/- Listar usuarios (admin)GET /usuarios/me- Obtener perfil actualGET /usuarios/{id}- Obtener usuario por IDPUT /usuarios/me- Actualizar perfil actualPUT /usuarios/{id}- Actualizar usuario (admin)DELETE /usuarios/me- Eliminar cuenta actual
# Registrar usuario
curl -X POST "http://localhost:8001/auth/register" \
-H "Content-Type: application/json" \
-d '{
"username": "testuser",
"email": "test@example.com",
"password": "testpassword",
"first_name": "Test",
"last_name": "User"
}'
# Login
curl -X POST "http://localhost:8001/auth/token" \
-H "Content-Type: application/x-www-form-urlencoded" \
-d "username=testuser&password=testpassword"
# Usar token en requests
curl -X GET "http://localhost:8001/auth/me" \
-H "Authorization: Bearer YOUR_TOKEN_HERE"- USUARIO: Rol básico, puede acceder a sus propios datos
- ADMIN: Acceso completo, puede gestionar todos los usuarios
- Crear el modelo en
models/ - Crear los esquemas en
schemas/ - Crear el router en
routers/ - Registrar el router en
main.py
# Ejecutar tests
pytest
# Con coverage
pytest --cov=api- API: http://localhost:8001
- PostgreSQL: localhost:5433
- Verifica que PostgreSQL esté ejecutándose
- Revisa las variables de entorno en
.env - Asegúrate de que el puerto 5433 esté disponible
- Verifica las credenciales en Google Cloud Console
- Asegúrate de que las URLs de redirección estén configuradas correctamente
- Revisa que las variables
GOOGLE_CLIENT_IDyGOOGLE_CLIENT_SECRETestén configuradas
- Fork el proyecto
- Crea una rama para tu feature (
git checkout -b feature/AmazingFeature) - Commit tus cambios (
git commit -m 'Add some AmazingFeature') - Push a la rama (
git push origin feature/AmazingFeature) - Abre un Pull Request
Este proyecto está bajo la Licencia MIT - ver el archivo LICENSE para detalles.